Понимание странного механизма многострочных комментариев Perl - PullRequest
13 голосов
/ 26 марта 2011

РЕДАКТИРОВАТЬ: Примечание для новых программистов Perl : Этот механизм НЕ должен использоваться для многострочных комментариев! Имеет недостаток, снижает читабельность.

В этом сообщении PerlMonks о механизмах создания многострочных комментариев в Perl , Абигайль предоставила это, которое озадачивает меня:

Проблема только с использованием документа здесь в том, что он выдаст предупреждение под '-w'. Намного лучше использовать малоизвестный оператор << >>.

<<q=~q>>;
  This is a multiline comment.
q

Запуск через -M0=Deparse дает:

"  This is a multiline comment.\n" =~ //;
-e syntax OK

Может кто-нибудь сказать мне, что происходит?

Ответы [ 3 ]

15 голосов
/ 26 марта 2011

Ответ Эбигейл отчасти юмористический. На самом деле нет оператора << >> (не в версиях Perl до 5.22 ), но есть (не очень известный, я думаю) оператор <<. Не бинарный оператор сдвига, а унарный здесь-документ (для краткости heredoc) . Простая форма этого:

$long_string = <<EOF;
This is a long, multiline string.
It ends when EOF appears alone on a line.
It will be assigned to the \$long_string variable.
EOF

Фактически, это функция «многострочного комментария», лежащая в основе ответа Абигейл - многострочный строковый литерал. Остальное - немного запутанный Perl.

Голое слово или строка в кавычках после << заканчивает строковый литерал. Вы можете использовать q как голое слово:

<<q;
This is a multiline comment, or rather a string literal whose value is ignored.
q

Чтобы понять остальную часть фрагмента Абигейл, полезно переписать документ здесь в простой строковый литерал:

"This is a multiline comment.\n" =~ q>>;

Хорошо, теперь q>> - это q кавычечный оператор с > в качестве символа-разделителя. q>> эквивалентно '' (не интерполированный литерал, который оказывается пустым). Таким образом, строковый литерал сопоставляется с пустым шаблоном . Результат этого сопоставления в любом случае игнорируется, но это приводит к сглаживанию переменных результата сопоставления ($1, $& и т. Д.).

11 голосов
/ 26 марта 2011

Хах. Не существует такого понятия, как оператор «<< >>». То, что там происходит, в основном эквивалентно этому:

"" =~ ''

=~ - это, конечно, обычный оператор привязки к шаблону, который вы обычно используете с m// или s///. '' использует синтаксис q {} для литеральных строк с > в качестве разделителя и интерпретируется как шаблон во время выполнения. "" - это документ здесь с q в качестве завершающей строки.

Я бы, конечно, не назвал это комментарием. Рассмотрим вывод этого фрагмента программы:

"copacetic" =~ q/(c[a-z]+)/;
print "$1\n";

<<q=~q>>;
    This is crap, not a comment!
q

print "$1\n";
5 голосов
/ 26 марта 2011

Это не так красиво, но это приводит к отсутствию исполняемого кода.

0 && <<COMMENT
...
COMMENT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...