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 ищет точное совпадение, так что регистр влияет на ее работу. Поэтому «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