Помогите мне понять это утверждение Perl с << 'ESQ' - PullRequest
2 голосов
/ 05 августа 2010
substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ';
 shift; # package
 ....
 ....
ESQ

Что это за ESQ и что он здесь делает? Пожалуйста, помогите мне понять эти утверждения.

Ответы [ 2 ]

10 голосов
/ 05 августа 2010

Отмечает конец раздела Здесь-Документ .

EOF более традиционен, чем ESQ.

1 голос
/ 14 августа 2012

Эта конструкция называется 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, надеюсь, все станет ясно.

...