Сокращение qw

Списки простых слов (как в последнем примере) достаточно часто используются в программах. Сокращение qw позволяет быстро создать такой список без множества лишних кавычек:

qw( fred barney betty wilma dino ) # То же, что прежде, но короче

Сокращение qw означает «Quoted Words» («квотирование по словам») или «Quoted by Whitespace» («квотирование по пропускам») в зависимости от того, кого вы спросите. Как бы то ни было, Perl интерпретирует данные в скобках по правилам строк в апострофах (соответственно в список qw, в отличие от строк в кавычках, нельзя включить \n или $fred). Пропуски (пробелы, табуляции, символы новой строки) удаляются, а все, что останется, преобразуется в список элементов. Из-за удаления пропусков тот же список можно записать другим (надо признать, довольно странным) способом:

qw(fred
barney betty
wilma dino ) # То же самое, но со странными пропусками

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


Несколько распространенных вариантов:

qw! fred barney betty wilma dino !
qw/ fred barney betty wilma dino /
qw# fred barney betty wilma dino # # Как в комментариях!
qw( fred barney betty wilma dino )
qw{ fred barney betty wilma dino }
qw[ fred barney betty wilma dino ]
qw< fred barney betty wilma dino >

Как показывают четыре последних примера, возможно использование двух разных ограничителей. Если открывающий ограничитель принадлежит к числу «левых» символов, то закрывающим ограничителем будет соответствующий «правый» символ. В остальных случаях один и тот же символ используется для пометки как начала, так и конца списка. Если закрывающий ограничитель должен присутствовать среди символов в списке, вероятно, вы неудачно выбрали ограничители. Но если сменить ограничитель почему-либо нежелательно или невозможно, символ все равно можно включить в список с префиксом :

qw! yahoo\! google ask msn ! # yahoo! включается как элемент списка

Как и в строках, заключенных в апострофы, два последовательных символа \\ обозначают один литеральный символ «обратная косая черта». Девиз Perl гласит: «Это можно сделать несколькими способами», однако у вас может появиться вопрос: зачем нужны все эти разные ограничители? Вскоре вы увидите, что существуют и другие разновидности оформления строк, в которых они могут пригодиться.


Но даже сейчас вы согласитесь с тем, что они будут удобны при построении списка имен файлов UNIX :

qw{
/usr/dict/words
/home/rootbeer/.ispell_english
}

Если бы косая черта была единственным возможным ограничителем, такой список было бы весьма неудобно читать, записывать и сопровождать.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
в списочном контексте
Главная служебная переменная: $_
Интерполяция массивов в строках
Использование выражений, создающих скаляры, в списочном контексте
Использование выражений, создающих списки, в скалярном контексте

Вернуться в раздел: Perl / 2. Списки и массивы