2012-08-14 10 views
7

Powiel możliwe:
Help me understand this Perl statement with <<'ESQ'Co to jest druk << EOF; i jak to działa?

Co oświadczenie w https://stackoverflow.com/questions/4151279/perl-print-eof robi dokładnie? Natknąłem się na poprzedni post, ale nie rozumiałem, co próbuje wyjaśnić. Co to jest PETE? Czy ktoś może wyjaśnić każdą linię? Jak działa kod?

print <<EOF; 
This is 
a multiline 
string 
EOF 

print <<PETE; 
This is 
a multiline 
string 
PETE 

Jaka jest różnica i podobieństwo między tymi dwoma? W miejsce PETE użyłem wielu innych słów, takich jak DOG i działa to samo za każdym razem.

Odpowiedz

20

To się nazywa tutaj-doc. Zasadniczo pobiera wszystko od następnego wiersza aż do końca linii znacznika i przedstawia go jako standardowe wejście do uruchomionego programu. Końcowa linia znaczników jest kontrolowana przez tekst następujący po <<.

Jako przykład, w bash (którego jestem bardziej zaznajomieni z ponad Perl), polecenie:

cat <<EOF 
hello 
goodbye 
EOF 

potrwa cat a następnie wysłać dwie linie do swojego standardowego wejścia (na cześć i linii goodbye). Perl ma tę funkcję, chociaż składnia jest nieco inna (jak można się spodziewać, biorąc pod uwagę, że jest to inny język). Nadal jest wystarczająco blisko, aby wyjaśnienie nadal się utrzymywało.

Wikipedia ma an entry for this, którą prawdopodobnie byś znalazł, gdybyś wiedział, że nazywa się tutaj-doc, ale w przeciwnym razie trudno byłoby to rozgryźć.

W konkretnych przypadkach, nie ma różnicy między używaniem EOF i PETE, istnieje związek pomiędzy markerem heredoc (bit następującym <<) i końca standardowego wejścia.

Na przykład, jeśli jeden z linii wejściowych była EOF, można naprawdę nie używać, jako markera ponieważ standardowe wejście zostanie zakończone przedwcześnie:

cat <<EOF 
This section contains the line ... 
EOF 
but then has more stuff 
and this line following is the real ... 
EOF 

W takim przypadku można użyć PETE (lub cokolwiek innego, co nie pojawia się w tekście we własnym wierszu).

Istnieją inne opcje, takie jak używanie cudzysłowów wokół znacznika (aby wcięcie mogło wyglądać lepiej) oraz użycie pojedynczych lub podwójnych cudzysłowów do kontrolowania zastępowania zmiennych.

Jeśli przejdziesz na stronę perlop i wyszukaj <<EOF, to na szczęście wszystko stanie się jasne.