У Рэндала Шварца есть отличная статья о документах ЗДЕСЬ .
Есть несколько вещей, которые следует помнить об этих документах:
-
;
в Perl является терминатором оператора и требуется для всех операторов Perl (с некоторыми исключениями), включая здесь строки документов;
- Этот документ представляет собой забавное выражение, которое на самом деле представляет собой большую строку;
- Должен быть завершающий CR для документа здесь (в отличие от большинства других операторов Perl);
- Вы можете иметь произвольный код Perl сразу после открывающего тега или после закрывающего тега. Если после закрывающего тега он должен находиться на отдельной строке. В любом случае код работает с текстом строки here;
- Кавычки, которые вы используете в тегах, влияют на строку. Двойные кавычки похожи на строки двойных кавычек в Perl, одинарные кавычки не интерполируются, обратные кавычки передаются в оболочку. Никакие кавычки не эквивалентны двойным кавычкам;
- TIMTOWTDI, но некоторые формы трудно читать;
Цитирование из perldoc -q "HERE documents"
(и perlfaq4 ):
После << part. Пробела не должно быть. </strong>
(вероятно) должна быть точка с запятой в конце [<<
части].
Вы не можете (легко) иметь пробел перед тегом.
Две ваши формы функционально эквивалентны. Так же, как { ... } if (blah blah)
совпадает с if (blah blah) { ... }
. Хотя эти два утверждения функционально эквивалентны, они «читают» по-разному.
Каждый из них является эквивалентным и действующим документом Perl здесь:
my %data = <<END
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
=~ /(\w+): (.*)/g;
и
my %data = <<END =~ /(\w+): (.*)/g;
fred: Fred Flintstone
barney: Barney Rubble
betty: Betty Rubble
wilma: Wilma Flintstone
END
# You must have a CR after the "END". Can't be EOF...
Оба устанавливают хэш %data
на first=>"full name"
для Флинтстоунов. Что бы вы предпочли увидеть в коде, приходящем к вам?
Обратите внимание, что во второй форме есть гоча: после завершающей метки должен быть текст или пробел, иначе вы можете получить Can't find string terminator "END" anywhere before EOF
Я думаю, именно поэтому вы видите одинокий ;
в некоторых документах, которые здесь есть ,
ИМХО, ;
принадлежит после первого экземпляра тега here doc или кода, который следует за ним. Труднее читать, если это после закрывающего тега. Если закрывающий тег имеет форму, похожую на модификатор оператора или логику предупреждения или ошибки. Это просто мой личный гид по стилю.