Эта конструкция называется here-doc (поскольку вы получаете стандартный ввод из документа here , а не из внешнего документа в файловой системе где-либо).
Он в основном считывает все, начиная со следующей строки и до конца строки маркера, но исключая ее, и использует ее в качестве стандартного ввода для программы или команды, которую вы выполняете. Конечная строка маркера контролируется текстом, следующим за <<
.
Например, в bash
(с которым я знаком больше, чем в Perl) команда:
cat <<EOF
hello
goodbye
EOF
запустит cat
и затем отправит две строки на свой стандартный ввод (строки "привет" и "до свидания"). Perl также имеет эту функцию, хотя синтаксис немного отличается (как и следовало ожидать, учитывая, что это другой язык). Тем не менее, оно достаточно близко, чтобы объяснение все еще оставалось в силе.
В Википедии есть запись для этого , которую вы, вероятно, нашли бы, если бы знали, что она называется here-doc, но в противном случае ее было бы довольно сложно выяснить.
Вы можете использовать любой подходящий маркер. Например, если одна из ваших строк ввода была EOF
, вы не могли бы использовать это как маркер, так как стандартный ввод был бы преждевременно завершен:
cat <<EOF
This section contains the line ...
EOF
but then has more stuff
and this line following is the real ...
EOF
В этом случае вы можете использовать DONE
(или все, что не отображается в тексте в отдельной строке).
Существуют и другие варианты, такие как использование кавычек вокруг маркера (чтобы отступы выглядели лучше) и использование одинарных или двойных кавычек для контроля замещения переменных.
Если вы перейдете на страницу perlop
и выполните поиск <<EOF
, надеюсь, все станет ясно.