Информационные технологииStfw.Ru 🔍

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

Глава 4 Операции и выражения
🕛 02.11.2006, 15:43
Кавычки (одинарные, двойные и обратные) в 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.


4.13.1. Операция q{}

Эта операция аналогична заданию строкового литерала в одинарных кавычках. В нем каждый символ строки представляет самого себя, подстановка значений переменных не выполняется. Единственное исключение - обрат

ная косая черта, за которой следует символ-разделитель или еще одна обратная косая черта. Эти последовательности символов позволяют ввести непосредственно в строку символ разделителя или обратную косую черту (хотя обратная косая черта и так представляет саму себя). Несколько примеров:


q-сДескриптор \<FILE\»; # Строка символов: Дескриптор <FILE>


д!Каталог \\bin\usr\n!; # Строка символов; Каталог \bin\usr\n


'Каталог \\bin\usr\n'; # Эквивалентно предыдущей операции


4.13.2. Операция qq{}

Эта операция аналогична заданию строкового литерала в двойных кавычках. При ее выполнении осуществляется подстановка в строку значений скалярных переменных, начинающихся с символа $, и переменных массивов скаляров, начинающихся с символа @, а также осуществляется интерпретация управляющих последовательностей (см. главу 3). После выполнения указанных действий будут сформированы строковые данные. Для задания в строке символа разделителя, используемого в этой операции, можно воспользоваться обратной косой чертой перед этим символом. Несколько примеров:


qq(print\(\) - функция вывода); # Строка символов:


# print() - функция вывода $т = 123; qq/4enoe\t$m\n/; # Строка символов:


# Целое 123 "Ifenoe\t$m\n"; # Эквивалентно предыдущей операции


4.13.3. Операция qx{}

Эта операция аналогична заданию строкового литерала в обратных кавычках. При ее вычислении сначала осуществляется подстановка значений скалярных переменных и переменных массивов скаляров (если таковые присутствуют) в строку, заданную между разделителями операции, а затем полученная строка, как некая команда, передается на выполнение командному интерпретатору операционной системы и результат ее выполнения подставляется в формируемое операцией qx{} окончательное строковое значение. Таким способом можно ввести в программу Perl результаты выполнения определенных команд или пользовательских программ. Несколько примеров:

$file = "file.tmp";


qxfdel $file); # Удаление файла с именем file.tmp

$rez = qx(progl -a); # Переменная

$rez содержит результаты вывода


# на экран программы progl

$rez = 'progl -a~; # Эквивалентно предыдущей операции


4.13.4. Операция qw{}

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


@m = qw( one two ); I Эквивалентно: $m[0] = 'one'; $m[l] = 'two'; Действие операции qw{СТРОКА} эквивалентно действию встроенной функции


split С ', qfCTPOKA});


(Описание функции split см. в главе 10.)


Наиболее часто встречающаяся ошибка при использовании этой операции - отделить слова запятыми. При включенном режиме отображения предупреждений -w будет сгенерировано сообщение о том, что, возможно, запятая используется для разделения слов, а не входит в состав слова.


4.13.5. Операция "документ здесь"

В 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 «'FIRST1; # Отобразит:


Пользователь: I Пользователь:


\t$var # \t$var


FIRST #


$coml = "echo Alex";


print «4FIRST'; # Отобразит:


$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 будет следующая строка:


"Первый\поперанд\пВторой\поперанд"

Учебник по Perl   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉