Perl: библиотека программиста (Том Кристиансен, Натан Торкингтон)

Введение

Начало

Экономика

Программирование

 

Многие языки программирования заставляют нас мыслить на неудобном низком уровне. Вам понадобилась строка, а язык хочет, чтобы вы работали с указателем или байтовым массивом. Впрочем, не отчаивайтесь - Perl не относится к языкам низкого уровня, и в нем удобно работать со строками. 

Perl проектировался для обработки текста. В сущности, в Perl существует такое количество текстовых операций, что их невозможно описать в одной главе. Рецепты обработки текста встречаются и в других главах. В частности, обратитесь к главе 6 "Поиск по шаблону" и главе 8 "Содержимое файлов" - в них описаны интересные приемы, не рассмотренные в этой главе.

Фундаментальной единицей для работы с данными в Perl является скаляр (scalar), то есть отдельное значение, хранящееся в отдельной (скалярной) переменной. В скалярных переменных хранятся строки, числа и ссылки. Массивы и хэши представляют собой соответственно списки или ассоциативные массивы скаляров. Ссылки используются для косвенных обращений к другим величинам; они отчасти похожи на указатели в языках низкого уровня. Числа обычно хранятся в формате вещественных чисел с двойной точностью. Строки в Perl могут иметь произвольную длину (ограниченную только объемом виртуальной памяти вашего компьютера) и содержат произвольные данные - даже двоичные последовательности с нулевыми байтами.

Строка не является массивом байт; к отдельному символу нельзя обратиться по индексу, как к элементу массива - для этого следует воспользоваться функцией substr. Строки, как и все типы данных Perl, увеличиваются и уменьшаются в размерах по мере необходимости. Неиспользуемые строки уничтожаются системой сборки мусора Perl (обычно при выходе переменной, содержащей строку, за преде-лы области действия или после вычисления выражения, в которое входит строка). Иначе говоря, об управлении памятью можно не беспокоиться - об этом уже позаботились до вас.

Скалярная величина может быть определенной или неопределенной. Определенная величина может содержать строку, число или ссылку. Единственным неопределенным значением является undef, все остальные значения считаются определенными - даже 0 и пустая строка. Однако определенность не следует путать с логической истиной; чтобы проверить, определена ли некоторая, величина следует воспользоваться функций defined. Логическая истина имеет особое значение, которое проверяется логическими операторами && и ||, а также в условии блока while.

Две определенные строки считаются ложными: пустая строка ("") и строка единичной длины, содержащая цифру "ноль" ("0"). Возможно, второе вас несколько удавит, но это связано с тем, что Perl выполняет преобразования между числами и строками по мере необходимости. Числа 0.0.00 и 0.00000000 без кавычек считаются ложными значениями, но в строках они становятся истинными (так строка "0.00" считается истинной, а не ложной). Все остальные определенные значения (например, false , 15 и \$х) истинны.

В строковом контексте значение undef интерпретируется как пустая строка (""). В (числовом контексте undef интерпретируется как 0, а в ссылочном - как нуль-ссылка. При этом во всех случаях оно считается ложным. Использование неопределенной величины там, где Perl ожидает получить определенную приводит к записи в STDERR предупреждения времени выполнения (если был использован флаг -w). Для простого вопроса о том, является ли нечто истинным или ложным, предупреждение не выдается. Некоторые операции не выдают предупреждений при использовании переменных, содержащих неопределенные значения. К их чис-лу относятся операции автоматического увеличения и уменьшения, ++ и --, а так-же сложение и конкатенация с присваиванием, += и . =.

В программах строки записываются в апострофах или кавычках, в форме q// или qq// или "встроенных документов" (here-documents). Апострофы используются в простейшей форме определения строк с минимальным количеством специальных символов: ' - завершает строку, \' - вставляет в нее апостроф, а \\ - обратную косую черту:

$string = '\n'; # Два символа, \ и n

$string = 'Jon \'Maddog\' Orwant'; # Внутренние апострофы

В строках, заключенных в кавычки, возможна интерполяция имен переменных (но не вызовов функций - о том, как это делается, см. рецепт 1.10). В них используется множество служебных символов: "\n" - символ перевода строки, "\033" - символ с восьмеричным кодом 33, "\cJ" - Ctrl+J и т. д. Полный список приведен в странице руководства реrlор(1).

$string = "\n"; # Символ перевода строки

$string = "Jon \"Maddog\" Orwant"; # Внутренние кавычки

Операторы q// и qq// позволяют чередовать разделители строк с апострофами и кавычками. Например, строку с внутренними апострофами проще записать в следующем виде, вместо того чтобы использовать служебные символы \':

$string = q/Jon 'Maddog' Orwant/; # Внутренние апострофы

В качестве разделителей могут использоваться одинаковые символы, как в этом примере, или парные (для различных типов скобок):

$string = q[Jon 'Maddog' Orwant]; # Внутренние апострофы
$string = q{Jon 'Maddog' Orwant}; # Внутренние апострофы
$string = q(Jon 'Maddog' Orwant); # Внутренние апострофы
$string = q<Jon 'Maddog' Orwant>; # Внутренние апострофы

Концепция "встроенных документов" позаимствована из командных интерпретаторов (shell) и позволяет определять строки, содержащие большое количество текста. Текст может интерпретироваться по правилам для строк, заключенных в апострофы или кавычки, и даже как перечень исполняемых команд - в зависимости от того, как задается завершающий идентификатор. Например, следующий встроенный документ будет интерпретироваться по правилам для строк, заключенных в кавычки:

$а = ""EOF";
This is a multiline here document
terminated by EOF on a line by itself
EOF

Обратите внимание: после завершающего EOF точка с запятой не ставится. Встроенные документы более подробно рассматриваются в рецепте 1.11.

Предупреждение для программистов из других стран: в настоящее время Perl не обладает прямой поддержкой многобайтовых кодировок (в версии 5.006 ожиается поддержка Unicode), поэтому в тексте книги понятия байт и символ считаются идентичными.

Назад Содержание Вперед

 

Сайт управляется системой uCoz