2015-06-24 47 views
1

我發現在一個列表中有兩個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中工作的原因。

+0

那麼,Perl是一種不同於Ruby的語言,它在Perl中工作的事實意味着什麼都沒有。有很多的東西可以在Ruby中無法使用的語言中工作。例如,在Smalltalk中,數組文字就像這樣寫成'#(1 2 3 4)',但在Ruby中不起作用。 –

回答

2
$data = [ 
<<'EOT1', <<'EOT2' 
more text 
EOT1 
and more 
EOT2 
] 

你的heredoc標記只是在錯誤的地方。

+0

我使用的語法實際上是有效的,至少對於Perl來說是這樣。因此我認爲它可以和Ruby一起工作。你所展示的只是另一種方式去做,但它應該和我展示的一樣好,我不明白爲什麼它沒有。我將更新顯示Perl代碼的問題。 – Nasser

+1

@Nasser它爲什麼會在Perl中起作用? –

+0

@Nasser:Ruby不像Perl那樣喜歡逗號前面的換行符(通常,所以這不是數組的特例)。你也可以這樣寫:https://eval.in/private/4a9bda6aef9b5a – cremno

相關問題