我有一個字符串,我想附加一個格式化的SQL塊。有沒有辦法使用這裏的文件追加?或者我需要使用here文檔創建一個新的字符串,並將其附加到現有的字符串?我可以使用here文檔來追加到字符串嗎?
2
A
回答
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文檔的內容)。
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
EOH是什麼意思? – Kirk 2015-01-23 01:57:38