Понимание странного механизма многострочного комментария 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