Операции заключения в кавычки

Обычно во всех языках программирования кавычки (одинарные, двойные иди обратные) используются для задания строковых литералов. В Perl, однако, это всего лишь удобный способ задания определенных операций над последовательностью символов.
Например, мы знаем, что заключение в двойные кавычки имени переменной или массива скаляра формирует строку, представляющую содержимое переменной или элементов массива, преобразованное к символьному виду. Подобная операция подстановки значения переменной (скалярной или массива скаляров) осуществляется и в общем случае, когда имя переменной встречается в строке символов, ограниченной двойными кавычками. Кроме подстановки значения переменной, операция заключения в двойные кавычки трактует некоторые последовательности символов, называемых управляющими последовательностями (например, \n, \t и т. д.) как выполняющие определенные действия.
Подобные же подстановки действуют и для строк, заключенных в обратные кавычки, причем полученная результирующая строка передается на выполнение как команда оболочки операционной системы, а возвращаемый ею результат и представляет строку, которая используется в сценарии Perl.
В строке символов, заключенной в одинарные кавычки, подобных подстановок значений переменных не выполняется, а каждый символ представляет непосредственно самого себя. Такую интерпретацию содержимого строк в одинарных кавычках мы также можем трактовать как некоторую операцию, выполняемую над ее содержимым.
В языке кроме трех перечисленных операций заключения в кавычки определен еще ряд операций, выполняющих определенные действия со строковыми данными и внешне похожих на операции заключения в кавычки. На них мы будем в дальнейшем ссылаться так же, как на операции заключения в кавычки.
Все операции заключения в кавычки представлены в табл. 4.9 с краткой формой (если таковая существует) и кратким описанием действий, осуществляемых при их выполнении.
Таблица 4.9. Операции заключения в кавычки
Общая форма Краткая форма Значение Возможность подстановки
q{} '' Строковый Нет
qq{} "" Строковый Да
qx{} `` Команда системы Да
qw{} ( ) Список слов Нет
m{} // Поиск по образцу Да
qr{}   Образец Да
s{}{}   Подстановка Да
tr{}{} y/// Транслитерация Нет
При использовании общей формы операции заключения в кавычки вместо фигурных скобок { }, представленных в табл. 4.9, можно использовать любую пару символов, выбранную в качестве разделителя. Если выбранный символ не является какой-либо скобкой (круглой, угловой, квадратной или фигурной), то он ставится в начале и в конце строки, к которой должна быть применена соответствующая операция. В случае указанных скобок-разделителей строка символов должна быть заключена в согласованные скобки, то есть открывающая скобка определяет начало строки символов, а закрывающая — ее конец. Между знаком операции и строкой, заключенной в символы-разделители, может быть произвольное число пробельных символов. Исключением из этого правила является использование символа # в качестве разделителя. В этом случае использование пробелов между ним и знаком операции недопустимо, так как в противном случае символ # будет трактоваться как начало комментария:
q #string#   # Знак операции q, за которым следует
             # комментарий 
q#string#    # Правильное задание
Обычно в качестве разделителя программистами Perl используется наклонная черта /, хотя это и не обязательно.
Обратите внимание, что только три операции заключения в кавычки (q { }, qw{ } и tr{ }{ }) не предоставляют возможности подстановки в строку значений скалярных переменных и массивов скаляров, а также интерпретацию управляющих символов.
В этом разделе мы остановимся только на первых четырех операциях заключения в кавычки.

Операция q{ }

Эта операция аналогична заданию строкового литерала в одинарных кавычках. Каждый символ в строке представляет самого себя. Подстановка значений переменных и интерпретация управляющих последовательностей не допускается. Единственное исключение — обратная наклонная черта, за которой следует символ-разделитель, или идущие подряд две обратные наклонные черты. Эти последовательности интерпретируются соответственно как символ-разделитель и одна обратная наклонная черта (хотя обратная наклонная черта и так представляет саму себя). Несколько примеров:
q<Дескриптор \<FlLE\>>; # Строка: Дескриптор <FILE> 
q!Каталог \bin\usr\n!;  # Строка:  Каталог \bin\usr\n 
'Каталог \bin\usr\n';   # Эквивалентно предыдущей # операции

Операция qq{ }

Эта операция аналогична заданию строкового литерала в двойных кавычках. Она осуществляет подстановку в строку значений скалярных переменных (имена, начинающиеся с символа $) и переменных массивов скаляров (имена, начинающиеся с символа @), а также выполняет интерпретацию управляющих последовательностей. После выполнения указанных действий будет сформирована истинная строка данных. Для задания в строке символа разделителя, используемого в этой операции, следует его маскировать с помощью символа обратной наклонной черты, непосредственно предшествующего символу-разделителю. Несколько примеров:
gq(print\(\) - функция вывода); # Строка символов:
                                # print( ) - функция вывода
$m = 123;
qq/Целое\t$m\n/; # Строка символов: Целое 123
"Целое\t$m\n";   # Эквивалентно предыдущей операции

Операция qx{ }

Эта операция аналогична заданию строкового литерала в обратных кавычках. При ее вычислении сначала осуществляется подстановка значений скалярных переменных и переменных массивов скаляров (если таковые присутствуют) в строку, заданную между разделителями операции. Затем полученная строка как некая команда передается на выполнение командному интерпретатору операционной системы и результат ее выполнения подставляется в формируемую операцией qx{ } окончательную строку. Таким способом можно выполнить команду операционной системы или пользовательской программы и ввести в сценарий Perl отображаемую на экране монитора информацию. Несколько примеров:
$file = "file.tmp";
qx(del $file);       # Удаление файла с именем file.tmp
$rez = qx(prog1 -a); # Переменная $rez содержит
                     # результаты вывода
                     # на экран программы prog1
$rez = `progl –a`;   # Эквивалентно предыдущей операции

Операция qw{ }

Эта операция возвращает список слов, выделенных из строки, заданной между символами-разделителями операции. Разделителем между словами считается символ пробела:
@m = qw( one two ); # Эквивалентно:
                    # $m[0] = 'one'; $m[l] = 'two';
Действие операции qw{CTPOKA} соответствует действию встроенной функции split разделения передаваемой ей во втором параметре строки на части при использовании в качестве разделителя (ее первый параметр) пробела:
split(' ', q{CTPОKA});
Различие заключается в том, что операция qw{ } формирует список слов во время компиляции программы, а функция split( ) будет формировать этот же список во время выполнения программы. Поэтому использование операции qw{ } предпочтительнее с точки зрения времени выполнения.
Эта операция чаще всего используется для импортирования в программу не всего модуля, а только некоторых его компонентов, необходимых для ее выполнения:
use POSIX qw( setlocale localeconv );
ВНИМАНИЕ Наиболее часто встречающаяся ошибка при использовании этой операции — отделение слов запятыми. При включенном режиме отображения предупреждений -w будет сгенерировано сообщение о том, что, возможно, запятая используется для разделения слов, а не входит в состав слова.

Следующая страница Содержание главы


Реклама