我發現在一個列表中有兩個HERE文檔時出現錯誤。我想問一下如何解決這個問題。這裏是一個MWE在列表中有兩個HERE文檔時出錯,如何解決
#!/usr/local/bin/ruby -w
$data=[
<<'EOT'
more text
EOT
,
<<'EOT'
and more
EOT
]
puts $data
的錯誤是
>./t9.rb
./t9.rb:6: syntax error, unexpected ',', expecting ']'
,
^
./t9.rb:7: warning: possibly useless use of a literal in void context
./t9.rb:10: syntax error, unexpected ']', expecting end-of-input
當使用%q{
代替EOT
錯誤消失(儘管我本來期望的語義是相同的上面的例子):
#!/usr/local/bin/ruby -w
$data=[
%q{more text},
%q{and more}
]
puts $data
而在單獨的列表使用EOT
項工程(即列表的列表)
#!/usr/local/bin/ruby -w
$data=[[
<<'EOT'
more text
EOT
],
[
<<'EOT'
and more
EOT
]]
puts $data
沒有錯誤。
所以問題是只有其中多於一個EOT
是在同一個列表條目中。爲什麼會造成問題?
>ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]
在嘗試這些示例,確保EOT
刷新一路的讓利,並且有後沒有空格在同一行。
更新
作爲參考,我在第一個例子中的perl使用上述工程的語法
>perl -v
This is perl 5, version 18, subversion 2 (v5.18.2) built for
i686-linux-gnu-thread-multi-64int
該腳本是
>cat t10.pl
#!/usr/bin/perl -w
use strict;
use warnings;
my @data = (
<<'EOT'
first line
EOT
,
<<'EOT'
second line
EOT
);
print @data
運行它
>./t10.pl
first line
second line
>
所以它適用於Perl,這就是我期望它能在Ruby中工作的原因。
那麼,Perl是一種不同於Ruby的語言,它在Perl中工作的事實意味着什麼都沒有。有很多的東西可以在Ruby中無法使用的語言中工作。例如,在Smalltalk中,數組文字就像這樣寫成'#(1 2 3 4)',但在Ruby中不起作用。 –