Понимание странного механизма многострочного комментария Perl

EDIT: Примечание для новых программистов на Perl. Этот механизм НЕ должен использоваться для многострочных комментариев! Он имеет недостатки, уменьшающие читаемость.

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

Проблема с использованием только здесь документа заключается в том, что он выдает предупреждение под "-w". Гораздо лучше использовать малоизвестный < → .

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

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

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

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

Ответ 1

Ответ Abigail частично юмористичен. На самом деле нет оператора << >> (не в версиях 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

Это, по сути, функция "многострочного комментария", лежащая в основе ответа Abigail - многострочный строковый литерал. Остальное немного запуталось в Perl.

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

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

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

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

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

Ответ 2

Хах. Нет такого понятия, как оператор "< lt; → ". То, что происходит, в основном эквивалентно этому:

"" =~ ''

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

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

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

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

print "$1\n";

Ответ 3

Ниже приведен пример не очень красивый, но он не приводит к выполнению кода.

0 && <<COMMENT
...
COMMENT