我在生产中发现了一个我不太懂的代码片段。我试图将其缩小到一个简单的例子:
%hash = {
'a' => 'apple',
'b' => 'banana',
'c' => 'cherry'
};
my $v = "Hello, " . '+' foreach (keys %hash);
print "Value = \"$v\"\n";
当我运行它时,$ v的值是空字符串,这是令人惊讶的。我也很好奇为什么。 '+'foreach(...)不会导致错误 - 我甚至没有'+'和foreach(...)之间的运算符,这怎么可能不会导致语法错误?
答案 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
之前或+'
之后放置运算符是没有意义的。