2011-03-29 76 views

回答

5

你也許可以說

$str = <<EOH; 
$str 
more stuff here 
EOH 

但Perl的優化,爲

$str .= <<EOH; 
more stuff here 
EOH 

你不應該需要建立一個獨立的變量在

$str1 = <<EOH; 
more stuff here 
EOH 
    $str .= $str1; 

;即使在較老的Perls中,前兩個應該也可以正常工作(而對於非常古老的Perl 5,有些情況不起作用,尤其是print <<EOH;會丟失here文檔的內容)。

+1

EOH是什麼意思? – Kirk 2015-01-23 01:57:38

2

是的,你可以。

$sql = "select something"; 
print <<END 
Line 1 
Line 2 
Line 3 
END 
. $sql; 

輸出:

Line 1 
Line 2 
Line 3 
select something 
2

這裏的文檔非常靈活,可以在大多數情況下使用普通的字符串文字。它們可以用作函數調用或複合表達式的一部分。

my $inner_str = 'middle text'; 

my $full_str = <<FIRST_BLOCK . "$inner_str\n" . <<SECOND_BLOCK; 
This text is at the start of the string. 
And so is this. 
FIRST_BLOCK 
This text ends the first assignment to the string. 
SECOND_BLOCK 

Perl的使用解析定界符允許一些非常奇怪的行爲規則,當一個定界符發現當前線將繼續解析,直到該行結束。然後,perl將停止解析當前表達式並開始讀取heredoc,直到找到結束標記爲止。一旦找到在該行開始的所有heredocs的結束標記,它就會繼續解析,就好像表達式中沒有中斷一樣。

$full_str .= <<THIRD_BLOCK . "$inner_str 
This text is "appended" to the string. 
THIRD_BLOCK 
" . <<LAST_BLOCK; 
This text ends the string. 
LAST_BLOCK 

print $full_str; 

注意,字符串定界符THIRD_BLOCK的身體開始之前,以及定界符THIRD_BLOCK後結束,但不包括其內容。

雖然您可以非常靈活地使用heredoc語法,但我建議您只使用每個表達式的一個heredoc,使表達式保持簡單。如果在一個表達式中需要多個heredocs,或者在複雜表達式中需要一個heredocs,則首先將heredoc分配給一個變量,然後在表達式中使用該變量。

+0

15年後,我正在學習關於perl語法的「最簡單」位的新東西。 – insaner 2016-11-16 04:25:22