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



当我在一个列表中有两个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中使用。

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

你的heredoc标记只是放错了地方。

最新更新