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

Pat*_*ckB 4 perl

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

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

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

print "Value = \"$v\"\n";
Run Code Online (Sandbox Code Playgroud)

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

Que*_*tin 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";
Run Code Online (Sandbox Code Playgroud)

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


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

因为你没有use strict,所以允许很多可怕的事情.没有它就很难运行use strict.

我甚至不具备运营商之间'+'foreach( ... )

您的代码相当于:

foreach (keys %hash) {
    my $v = "Hello, " . '+';
}
Run Code Online (Sandbox Code Playgroud)

在之前foreach或之后放置操作员是没有意义的+'.