当我在一个列表中有两个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中工作的原因。
答案 0 :(得分:2)
$data = [
<<'EOT1', <<'EOT2'
more text
EOT1
and more
EOT2
]
你的heredoc标记只是在错误的地方。