Разное

Perl длина строки – length, lc, uc, index, substr

length, lc, uc, index, substr

В этой части Учебника Perl мы узнаем о некоторых функциях Perl, предназначенных для работы со строками.

lc, uc, length

Существует несколько простых функций, таких как lc и uc, которые возвращают строку соответственно в нижнем и в верхнем регистре. Еще есть функция length, возвращающая количество символов в данной строке.

Взгляните на пример:

use strict;
use warnings;
use 5.010;

my $str = 'HeLlo';

say lc $str;      # hello
say uc $str;      # HELLO
say length $str;  # 5

index

Еще одна функция — index. Она принимает две строки и возвращает положение второй строки внутри первой.

use strict;
use warnings;
use 5.010;

my $str = "The black cat jumped from the green tree";

say index $str, 'cat';             # 10
say index $str, 'dog';             # -1
say index $str, "The";             # 0
say index $str, "the";             # 26

Первый вызов index вернул 10, потому что строка «cat» начинается на 10 символе. Второй вызов index вернул -1, указывая на то, что в этом предложении нет «dog».

Третий вызов показывает, что index возвращает 0, когда вторая строка стоит в начале первой.

Четвертый пример показывает, что index ищет точное совпадение, так что регистр влияет на ее работу. Поэтому «the» и «The» — не одно и то же.

index() ищет строки, а не слова, так что строку «e » тоже можно найти:

say index $str, "e ";              # 2

index() также может принимать третий параметр, указывающий на место, откуда начать поиск. Так что, раз мы нашли «e » сначала на 2-м символе первой строки, можно попытаться поискать, начиная с 3-его, чтобы узнать, не встречается ли в этой строке еще «e «:

say index $str, "e ";              # 2
say index $str, "e ", 3;           # 28
say index $str, "e", 3;            # 18

Поиск «e» без пробела даст другой результат.

Наконец, существует еще одна функция под названием rindex (right index, правый индекс), которая начинает поиск с правого конца строки:

say rindex $str, "e";              # 39
say rindex $str, "e", 38;          # 38
say rindex $str, "e", 37;          # 33

substr

Наверное, самая интересная функция в этой статье это substr. Это, по сути, противоположность index(). Если index() говорит нам, где расположена данная строка, substr возвращает подстроку, расположенную в данном месте. Как правило, substr принимает 3 параметра. Первый — это строка. Второй — это положение (начиная с нуля), также называемое смещение, и третий — длина строки, которую мы хотим получить.

use strict;
use warnings;
use 5.010;

my $str = "The black cat climbed the green tree";

say substr $str, 4, 5;                      # black

substr начинает отсчет с нуля, так что символ со смещением 4 это буква b.

say substr $str, 4, -11;                    # black cat climbed the

Третий параметр (длина) может быть и отрицательным числом. В этом случае он определяет количество символов с правого конца строки, которые НЕ будут включены. Таким образом, предыдущий код значит: отсчитать 4 символа от начала, 11 от конца, и вернуть то, что между ними.

say substr $str, 14;                        # climbed the green tree

Также можно опустить 3-й параметр (длину), что будет значить: вернуть все символы начиная от 14 и до конца строки.

say substr $str, -4;                        # tree
say substr $str, -4, 2;                     # tr

Мы можем использовать отрицательное число в качестве смещения, что будет значить: отсчитать 4 символа с конца и начать оттуда. То есть то же самое, что установить смещение length($str)-4.

Замена части строки.

Последний пример немного стремный. Пока что substr всегда возвращала подстроку и оставляла исходную строку нетронутой. В этом примере возвращаемое значение будет определяться так же, но вдобавок будет изменено содержимое исходной строки!

Возвращаемое значение substr() всегда определяется первыми тремя параметрами, но в данном случае мы передаем еще и четвертый. Это строка, которая заменит подстроку в исходной строке.

my $z = substr $str, 14, 7, "jumped from";
say $z;                                                     # climbed
say $str;                  # The black cat jumped from the green tree

Итак, substr $str, 14, 7, «jumped from» возвращает словоclimbed, но, поскольку мы передали четвертый параметр, исходная строка была изменена.

ru.perlmaven.com

Функции обработки строк и скаляров — Справочник Web-языков

Материал из Справочник Web-языков

chomp

Удаляет из каждого строкового элемента списка замыкающий символ завершения записи, соответствующий значению переменной $/ (по умолчанию — символ новой строки «n»). Возвращает общее количество удаленных символов. Список может состоять из одной переменной.

chomp СПИСОК
chomp     (эквивалентно chomp $_)

chop

Удаляет из каждого строкового элемента списка последний символ. Возвращаемое значение — удаленный символ из последнего элемента списка. Сисок может состоять из одной переменной.

chop СПИСОК
chop      (эквивалентно chop $_)

chr

Возвращает символ, код которого представлен числовым параметром.

chr ЧИСЛО
chr       (эквивалентно chr $_)

crypt

Шифрует ТЕКСТ с использованием заданного в параметре шифра. Обратной функции дешифровки не существует.

crypt ТЕКСТ, ШИФР

hex

Интерпретирует строковое ВЫРАЖЕНИЕ как шестнадцатиричное число и вычисляет его десятичный эквивалент.

hex ВЫРАЖЕНИЕ
hex       (эквивалентно hex $_)

index

Возвращает позицию первого вхождения указанной подстроки в заданную строку или -1, если подстрока не найдена. Если задан параметр ПОЗИЦИЯ, то поиск подстроки осуществляется, начиная с заданной позиции в строке (0 — начало строки)

index СТРОКА, ПОДСТРОКА[, ПОЗИЦИЯ]

lc

Преобразует все прописные буквы строкового параметра ВЫРАЖЕНИЕ в строчные и возвращает полученную строку. Использует текущие установки локализации, если используется use local.

lc ВЫРАЖЕНИЕ
lc        (эквивалентно lc $_)

lcfirst

Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в нижний регистр и возвращает полученную строку. Использует текущие установки локализации, если используется use local.

lcfirst ВЫРАЖЕНИЕ
lcfirst   (эквивалентно lcfirst $_)

length

Возвращает количество байтов в строке, являющейся значением параметра ВЫРАЖЕНИЕ.

length ВЫРАЖЕНИЕ
length    (эквивалентно length $_)

oct

Интерпретирует строковое ВЫРАЖЕНИЕ как восьмеричное число и вычисляет его десятичный эквивалент. Если строка начинается с символов «0x», то ее содержимое интерпретируется как шестнадцатиричное число.

oct ВЫРАЖЕНИЕ
oct       (эквивалентно oct $_)

ord

Возвращает числовой ASCII-код первого символа строки, являющейся значением параметра ВЫРАЖЕНИЕ.

ord ВЫРАЖЕНИЕ
ord       (эквивалентно ord $_)

pack

Упаковывает массив или список значений в двоичную структуру в соответствии с заданным шаблоном, представляющим собой последовательность символов, которые задают порядок и тип значений. Возвращает строку, содержащую полученную структуру. эшщ

pack ШАБЛОН, СПИСОК

гшдг

reverse

В списковом контексте возвращает список значений, состоящих из элементов заданного параметром СПИСОК списка; в скалярном контексте соединяет все элементы списка в одну строку и возвращает строку, состоящую из символов полученной строки, но в обратном порядке.

reverse СПИСОК

rindex

Синтаксис:

rindex STR, SUBSTR, POSITION

Находит последнее, ограниченное справа позицией POSITION, вхождение подстроки SUBSTR в строку STR, и возвращает найденную позицию. Если подстрока SUBSTR не найдена, возвращается значение $[ -1.

Пример:

    #!/bin/perl
    $STR = "Этот безумный, безумный, безумный, безумный мир!";
    $SUBSTR = "безумный";
    $POS = 7;
    print "Индекс первого символа строки по умолчанию равен $[n";
    print "Позиция первого вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",index($STR, $SUBSTR), "n";
    print "Позиция первого после позиции $POS вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",index($STR, $SUBSTR, $POS), "n";
    print "Позиция последнего вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",rindex($STR, $SUBSTR), "n";
    print "Позиция последнего перед позицией $POS вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",rindex($STR, $SUBSTR, $POS), "n";
    $[=2;
    print "nИндех первого символа строки по умолчанию изменен на $[n";
    print "Позиция первого вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",index($STR, $SUBSTR), "n";
    print "Позиция первого после позиции $POS вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",index($STR, $SUBSTR, $POS), "n";
    print "Позиция последнего вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",rindex($STR, $SUBSTR), "n";
    print "Позиция последнего перед позицией $POS вхождения подстроки '$SUBSTR'
               в строку '$STR' = ",rindex($STR, $SUBSTR, $POS), "n";

В результате выполнения скрипта будут выведены следующие строки :

    Индекс первого символа строки по умолчанию равен 0
    Позиция первого вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 5
    Позиция первого после позиции 7 вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 15
    Позиция последнего вхождения подстроки 'безумный'
       в строрку 'Этот безумный, безумный, безумный, безумный мир!' = 35
    Позиция последнего перед позицией 7 вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 5
    Индекс первого символа строки по умолчанию изменен на 2
    Позиция первого вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 7
    Позиция первого после позиции 7 вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 7
    Позиция последнего вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 37
    Позиция последнего перед позицией 7 вхождения подстроки 'безумный'
       в строку 'Этот безумный, безумный, безумный, безумный мир!' = 7

sprintf

Возвращает строку, представляющую форматный вывод списка значений определяемого параметра СПИСОК, в соответствии с заданной первым параметром ФОРМАТ строкой формата. Символы форматирования соответствуют аналогичной функции в языке C.

sprintf ФОРМАТ, СПИСОК

substr

Извлекает из строки, заданной параметром СТРОКА, подстроку длиной равной значению параметра ДЛИНА, начиная с символа, заданного параметром СМЕЩЕНИЕ. Если СМЕЩЕНИЕ отрицательно, то извлечение начинается с последнего символа строки. Если значение параметра ДЛИНА отрицательно, то от конца строки отсекается количество символов, равное абсолютному значению этого параметра. Если задана строка ЗАМЕЩЕНИЕ, то выделенная подстрока замещается ею в параметре СТРОКА, которы в этом случае должен быть lvalue.

substr СТРОКА, СМЕЩЕНИЕ [, ДЛИНА[, ЗАМЕЩЕНИЕ]]

uc

Преобразаут все строчные буквы строкового параметра ВЫРАЖЕНИЕ в прописные и возвращает полученную строку. Использует текущие установки локализации, если используется use local.

uc ВЫРАЖЕНИЕ
uc        (эквивалентно uc $_)

ucfirst

Преобразует первый символ строкового параметра ВЫРАЖЕНИЕ в верхний регистр и возвращает полученную строку. Использует текущие установки локализации, если используется use local.

ucfirst ВЫРАЖЕНИЕ
ucfirst   (эквивалентно ucfirst $_)

www.spravkaweb.ru

21. Определение длины строки в Perl 6 – Вечерний Perl 6

Perl 6 сразу и без обиняков считает исходный текст программы сохраненным в UTF-8. Да и вообще, поддержка юникода в Perl 6 очен радует. Сегодня посмотрим, как узнать длину строки.

Решение в лоб, знакомое по опыту Perl 5, не работает. На попытку вызвать функцию length компилятор выдает инструкцию воспользоваться новыми возможностями:

Undeclared routine:
    length used at line 1. Did you mean 'elems', 'chars', 'codes'?

elems, chars и codes

Метод elems относится скорее к массивам, чем к строкам. А вот с chars и codes давайте разберемся.

Метод символов в строке:

say 'hello'.chars;  # 5
say 'café'.chars;   # 4
say 'привет'.chars; # 6
say '嗨'.chars;     # 1

Все отлично работает независимо от языка и наличия диакритических знаков.

Метод codes возвращает число кодовых позиций, необходимых для записи строки. Во многих случаях результат будет совпадать с тем, что возвращает chars. Если же юникодный символ собран из таких частей, которые невозможно воспроизвести в одиночном символе (например, буква плюс какой-то хитрый диакритический знак, который в известных языках не применяется с данной буквой), то Perl не сможет привести этот символ к каноническому виду и, соответственно, chars покажет 1, а codes — 2.

Длина в байтах

Если нужно определить длину строки в байтах, то просто вызвать метод, например, bytes, не получится. Хотя скорее всего вы имели в виду кодировку UTF-8, Perl 6 желает услышать это явно. Действительно, при разном кодировании одна и та же строка занимет разное число байтов. Вот как это делается:

say 'hello'.encode('UTF-8').bytes;  # 5
say 'café'.encode('UTF-8').bytes;   # 5
say 'привет'.encode('UTF-8').bytes; # 12
say '嗨'.encode('UTF-8').bytes;     # 3

В UTF-16, например, число байт будет отличаться:

say 'hello'.encode('UTF-16').bytes;  # 10
say 'café'.encode('UTF-16').bytes;   # 8
say 'привет'.encode('UTF-16').bytes; # 12
say '嗨'.encode('UTF-16').bytes;     # 2

Разумеется, при попытке посчитать байты в Latin-1, часть строк не сможет быть конвертирована:

$ perl6 -e'say "ю".encode("Latin-1")'
Error encoding Latin-1 string: could not encode codepoint 1102
  in block  at -e line 1

Like this:

Like Loading…

Related

perl6.ru

perl — Включить длину строки в скрипте Perl

Будьте осторожны с инструкцией переключателя, которая является очень экспериментальной

Как упоминалось ранее, функция «переключателя» считается весьма экспериментальной; он может быть изменен с небольшим уведомлением. В частности, when происходит сложное поведение, которое, как ожидается, изменится, чтобы стать менее сложным в будущем. Не полагайтесь на его текущую (неправильную) реализацию. До Perl 5.18, given что у вас также было сложное поведение, вы все равно должны опасаться, если ваш код должен работать в более старых версиях Perl.

Они сложны и будут меняться.

Сказав это, один способ подсчета слов в строке состоит в том, чтобы сначала разбить его

use warnings;
use strict;
use feature 'switch';

my $file = '...';
open my $fh, '<', $file  or die "Can't open $file: $!";

while (my $line = <$fh>)
{
    chomp $line;
    my @words = split ' ', $line;
    my $num_words = @words;

    given ($num_words) {
        when ($num_words > 2) { 
            # ...
        }
    }
}
close $fh;

что использует тот факт, что скаляр ($num_words) при назначении массива (@words) получает количество элементов массива. См. Контекст в perldata

Присвоение немного отличается тем, что использует левый аргумент для определения контекста для правильного аргумента. Присвоение скаляру оценивает правую часть в скалярном контексте, […]

и массив, оцененный в скалярном контексте, дает количество его элементов.


Чтобы получить счетчик без создания переменной массива, нам нужно назначить список скаляру, что невозможно сделать напрямую. Однако существуют обходные пути, например

my $num_words = () = $line =~ /\w+/g;

где «operator» =() = является игрой в контексте, или

my $num_words = @{ [ $line =~ /\w+/g ] };

где [] берет ссылку на список внутри и затем получает от @{ }, что может быть назначено скаляру. Этот метод работает также с split ' ', $line.

См. Эту страницу для получения большой информации о списках, массивах и скалярах.


Это можно записать более компактно, так как

while (<$fh>) {
    chomp;
    my $num_words = @{ [ split ] };
    # ...
}

По умолчанию для while, chomp и split используется переменная $_. split также нужен шаблон, а по умолчанию — ' ', поэтому выше это то же самое, что и split ' ', $_. Шаблон ' ' является специальным для split и соответствует любому количеству пробелов, также отбрасывая ведущее и конечное пространство.

qaru.site

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *