Операции заключения в кавычки
Кавычки (одинарные, двойные и обратные)
в Perl мы используем для задания строковых литералов, причем получающиеся результирующие
строковые данные существенно зависят от используемого типа кавычек: символы
строки в одинарных кавычках трактуются так, как они в ней заданы, тогда как
некоторые символы ($, @) или даже последовательности символов (\ п
, \t) в строке в двойных кавычках выполняют определенные действия. Всё дело
в том, что в Perl кавычки — это всего лишь удобный синтаксический эквивалент
определенных операций, выполняемых над символами строки. В языке, кроме трех
перечисленных операций заключения в кавычки, определен еще ряд операций, выполняющих
определенные действия со строковыми данными и внешне похожих на операции заключения
в кавычки, на которые мы будем в дальнейшем ссылаться так же, как на операции
заключения в кавычки.
Все операции заключения в
кавычки представлены в табл. 4.3 с эквивалентным синтаксисом (если таковой
существует) и кратким описанием действий, выполняемых при их выполнении.
Таблица 4.3. Операции заключения в кавычки
Общая форма |
Эквивалентная форма |
Значение |
Возможность подстановки |
q{ } |
* i |
Строковый литерал |
Нет |
qq{ } |
it ii' |
Строковый литерал
|
Да |
qx{ } |
|
Команда системы
|
Да |
qw { } |
0 |
Список слов |
Нет |
m{ } |
// |
Поиск по образцу
|
Да |
qr{ } |
|
Образец |
Да |
s { } { } |
|
Подстановка |
Да |
tr{ }{ } |
у/// |
Транслитерация
|
Нет |
При использовании общей формы
операции заключения в кавычки вместо фигурных скобок {}, представленных в табл.
4.3, можно использовать любую пару символов, выбранную в качестве разделителя.
Если выбранный символ не является какой-либо скобкой (круглой, угловой, квадратной
или фигурной), то он ставится в начале и в конце строки, к которой должна быть
применена соответствующая операция, тогда как в случае использования скобок-разделителей
сначала используется открывающая скобка, а в конце закрывающая. Между знаком
операции и строками в символах-разделителях может быть произвольное число пробельных
символов. Обычно в качестве разделителя программистами Perl используется косая
строка "/", хотя это и не обязательно.
В табл. 4.3 в последнем столбце также указывается, осуществляет ли соответствующая
операция подстановку значений скалярных переменных и массивов, а также интерпретацию
управляющих символов.
В этом параграфе мы остановимся только на первых четырех операциях заключения
в кавычки. Остальные операции, как непосредственно связанные с регулярными выражениями,
будут подробно рассмотрены в главе 10.
Операция q{}
Эта операция аналогична заданию
строкового литерала в одинарных кавычках. В нем каждый символ строки представляет
самого себя, подстановка значений переменных не выполняется. Единственное исключение
— обратная косая черта, за которой следует символ-разделитель или еще одна обратная
косая черта. Эти последовательности символов позволяют ввести непосредственно
в строку символ разделителя или обратную косую черту (хотя обратная косая черта
и так представляет саму себя). Несколько примеров:
q-сДескриптор \<FILE\»; # Строка символов: Дескриптор <FILE>
д!Каталог \\bin\usr\n!; # Строка символов; Каталог \bin\usr\n
'Каталог \\bin\usr\n'; # Эквивалентно
предыдущей операции
Эта операция аналогична заданию строкового литерала в двойных кавычках. При
ее выполнении осуществляется подстановка в строку значений скалярных переменных,
начинающихся с символа $, и переменных массивов скаляров, начинающихся с символа
@, а также осуществляется интерпретация управляющих последовательностей.
После выполнения указанных действий будут сформированы строковые данные.
Для задания в строке символа разделителя, используемого в этой операции, можно
воспользоваться обратной косой чертой перед этим символом. Несколько примеров:
qq(print\(\) - функция вывода);
# Строка символов:
# print() - функция вывода $т = 123; qq/4enoe\t$m\n/; # Строка символов:
# Целое 123 "Ifenoe\t$m\n"; # Эквивалентно предыдущей операции
Операция qx{}
Эта операция аналогична заданию строкового литерала в обратных кавычках. При ее вычислении сначала осуществляется подстановка значений скалярных переменных и переменных массивов скаляров (если таковые присутствуют) в строку, заданную между разделителями операции, а затем полученная строка, как некая команда, передается на выполнение командному интерпретатору операционной системы и результат ее выполнения подставляется в формируемое операцией qx{} окончательное строковое значение. Таким способом можно ввести в программу Perl результаты выполнения определенных команд или пользовательских программ. Несколько примеров:
$file = "file.tmp";
qxfdel $file); # Удаление файла с именем file.tmp
$rez = qx(progl -a); # Переменная
$rez содержит результаты вывода
# на экран программы progl
$rez = 'progl -a~; # Эквивалентно
предыдущей операции
Операция qw{}
Эта операция возвращает список слов,
выделенных из строки, заданной между разделителями операции. Разделителями между
словами считаются пробельные символы:
@m = qw( one two ); I Эквивалентно:
$m[0] = 'one'; $m[l] = 'two'; Действие операции qw{СТРОКА} эквивалентно действию
встроенной функции
split С ', qfCTPOKA});
(Описание функции split см. в части 10.)
Наиболее часто встречающаяся ошибка
при использовании этой операции — отделить слова запятыми. При включенном режиме
отображения предупреждений -w будет сгенерировано сообщение о том, что, возможно,
запятая используется для разделения слов, а не входит в состав слова.
Операция "документ здесь"
В Perl реализована еще одна интересная
возможность "ввода" строковых данных в программу, которая основана
на синтаксисе "документ здесь" командного интерпретатора
shell системы UNIX. Она позволяет определить в программе строковые данные большого
объема, расположенные в нескольких последовательных строках текста программы,
и использовать их в качестве операндов разных операций: присваивания, печати
и т. п.
Ее синтаксис прост: после знака
операции « задается завершающий идентификатор, который служит признаком
окончания задания строковых данных. Это означает, что все строки данных, расположенные
между текущей строкой, содержащей операцию "документ здесь" и строкой,
содержащей завершающий идентификатор, рассматриваются как единый фрагмент строковых
данных:
$multi_line_string = «LINES; строка 1 строка 2 LINES
В приведенном фрагменте кода скалярная переменная $muiti_iine_string будет содержать
строку "строка 1\пстрока 2\п". Как видим, введенные нами с клавиатуры
символы перехода на новую строку сохраняются при использовании операции "документ
здесь". По умолчанию операция "документ здесь" интерпретирует
содержимое всех строк программы до завершающего идентификатора как строковые
данные, заключенные в двойные кавычки, сохраняя в них символ перехода на новую
строку "\n". Perl позволяет явно
указать, как будут интерпретироваться данные при этой операции, заключив в двойные
кавычки завершающий идентификатор операции. Следующие две операции "документ
здесь" эквивалентны:
print «m;
line 1
m
print << "m"
;
line 1
m
Идентификатор можно задавать и в одинарных кавычках, и в обратных кавычках.
В этом случае содержимое последующих строк программы до строки, содержащей завершающий
идентификатор, трактуется как строковые данные в соответствующих кавычках.
В строке, физически ограничивающей данные операции "документ здесь",
завершающий идентификатор задается без каких-либо кавычек.
При задании завершающего идентификатора в кавычках на строковые данные распространяются
все правила подстановок переменных и управляющих символов, применяемые к строкам,
ограниченным соответствующим типом кавычек. Пример 4.16 демонстрирует использование
различных кавычек в операции "документ здесь".
#! peri -w
$var = "Александр"; print «FIRST; # Отобразит: Пользователь:
# Пользователь: \t$var # Александр FIRST #
print «'FIRST 1 ; # Отобразит:
Пользователь: I Пользователь:
\t$var # \t$var
FIRST #
$coml = "echo Alex";
print « 4 FIRST';
# Отобразит:
$coml i Alex FIRST # .
Обратите внимание, что в примере 4.16 использовался одинаковый завершающий идентификатор
FIRST. Это не приводит к двусмысленностям и ошибкам компиляции, так как компилятор
ищет первую после операции « строку с завершающим идентификатором. Главное,
чтобы завершающий идентификатор в строке завершения был задан именно так, как
он задан в самой операции.
Замечание
При использовании операции "документ
здесь" с завершающим идентификатором в обратных кавычках в некоторых операционных
системах может возникнуть проблема с обработкой потока команд, определяемого
в нескольких строках. Не все командные интерпретаторы могут обрабатывать несколько
строк команд. Обычно они ориентированы на ввод команды в строке ввода, выполнения
ее и ожидания следующего ввода команды. Некоторые командные оболочки могут обрабатывать
несколько команд, заданных в одной строке через разделитель, например, командный
интерпретатор cmd системы Windows NT, в котором разделителем служит символ &.
Если завершающий идентификатор
в операции « задан без кавычек, то он должен следовать за знаком операции
без каких-либо пробелов. Если такое случается, то Perl интерпретирует эту операцию
с завершающим идентификатором пустая строка "" и ищет в тексте программы
первую пустую строку, ограничивающую строковые данные этой операции:
$var = "Александр";
print « х2; i Отобразит 2 раза следующие 3 строки:
Пользователь: # Пользователь:
\t$var # Александр
х2 1x2
# Пустая строка завершает операцию «
В этом фрагменте кода ошибочно поставлен пробел перед завершающим идентификатором
х2. Компилятор разобрал строку с операцией печати print следующим образом: строковые
данные, вводимые операцией -«, завершаются пустой строкой, после чего
они просто повторяются 2 раза (последовательность символов х2 понимается как
операция повторения строки х с правым операндом равным 2).
Этот пример подобран специально таким образом, чтобы он нормально откомпилировапся.
Если вместо идентификатора х2 поставить, например FIRST, то компилятор сгенерирует
ошибку.
Результат выполнения операции "документ здесь" можно использовать
в качестве операнда строковых операций. Можно даже использовать несколько операций
« в одном операторе, расположив строки их данных последовательно Друг
под другом, не забыв, конечно, строки с завершающим идентификатором:
$stack = «"ONE". «"TWO";
Первый
операнд
ONE
Второй
операнд
TWO
Значением скалярной переменной $stack будет следующая строка:
"Первый\поперанд\пВторой\поперанд"