在列表中包含两个HERE-DOCUMENTS时出错,如何解决

时间:2015-06-24 23:12:28

标签: ruby

当我在一个列表中有两个HERE-DOCUMENTS时,我发现我收到了错误。我想问一下如何解决这个问题。这是一个MWE

#!/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一直刷到let,并且在同一行后面没有空格。

更新

作为参考,我在上面第一个例子中使用的语法在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中工作的原因。

1 个答案:

答案 0 :(得分:2)

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

你的heredoc标记只是在错误的地方。