为什么这会返回空字符串?

时间:2014-04-08 20:19:14

标签: perl

我在生产中发现了一个我不太懂的代码片段。我试图将其缩小到一个简单的例子:

%hash = {
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'cherry'
};

my $v = "Hello, " . '+' foreach (keys %hash);

print "Value = \"$v\"\n";

当我运行它时,$ v的值是空字符串,这是令人惊讶的。我也很好奇为什么。 '+'foreach(...)不会导致错误 - 我甚至没有'+'和foreach(...)之间的运算符,这怎么可能不会导致语法错误?

1 个答案:

答案 0 :(得分:8)

你应该use warnings;

  

参考文献找到了test.pl第3行的预期大小列表。

您将单个值(hashref)分配给%hash,而不是键/值对列表。

您还应该use strict;

  

在连接(。)中使用未初始化的值$ v或在test.pl第12行使用字符串。

您已将my $v置于for循环中,因此它的范围限定为该循环。

此代码现在没有语法错误:

use strict;
use warnings;

my %hash = (
    'a' => 'apple',
    'b' => 'banana',
    'c' => 'cherry'
);

my $v;

$v = "Hello, " . '+' foreach (keys %hash);

print "Value = \"$v\"\n";

...但是每次循环时,你都会用相同的字符串($v)覆盖"Hello, " . '+'


  

这怎么可能不会导致语法错误?

由于您没有use strict,因此可以使用许多可怕的内容。在没有use strict的情况下运行很少有用。

  

我甚至没有'+'foreach( ... )

之间的运算符

您的代码相当于:

foreach (keys %hash) {
    my $v = "Hello, " . '+';
}

foreach之前或+'之后放置运算符是没有意义的。