【发布时间】:2015-06-03 04:52:11
【问题描述】:
鉴于此代码:
#!/usr/bin/perl -w
use strict;
use warnings;
sub foo {
return wantarray ? () : "value1";
}
my $hash = {
key1 => foo(),
key2 => 'value2'
};
use Data::Dumper;
print Dumper($hash);
我得到以下输出:
$VAR1 = {
'key1' => 'key2',
'value2' => undef
};
当我期望时:
$VAR1 = {
'key1' => 'value1',
'key2' => 'value2'
};
我知道散列是一种偶数大小的数组(正如我得到的“散列分配中的奇数个元素”警告所证明的那样),但散列元素只能是标量,为什么编译器会给它数组上下文?
我在直接分配给哈希时使用 CGI 模块的 param 函数发现了这一点。上面的 foo() 函数是对 CGI::param('mistyped_url_param') 的调用,它返回一个空数组,破坏(旋转?)哈希结构。
【问题讨论】:
-
一个不相关的点:你不再需要 shebang 行中的'-w','使用警告'取代了它。 (虽然 -w 为所有加载的包打开警告,而不仅仅是在当前范围内)
-
很公平,这是那些不容易消失的旧习惯之一... vi xxx.pl; #!/usr/bin/perl -w;它只是流动:)