我终于发现我的代码在标量上下文而不是列表上下文中得到评估,即使我在赋值周围有()。
第一个问题是为什么在表达式/赋值上加上“ || die ...”会导致它在标量上下文中求值?
2nd,在进行列表分配时是否可以使用“ || die ....”惯用语/等效语?
这是我的示例代码来演示此问题。
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper qw(Dumper);
my $h1 = {
var => "1",
bar => "1",
baz => "1",
};
my $h2 = {
var => "2",
bar => "2",
baz => "2",
};
my $ds;
$ds->{rules} = [$h1,$h2];
print "TEST1\n";
print Dumper($ds);
print "TEST2\n";
my (@processes) = @{$ds->{rules}};
print Dumper(\@processes);
print "@processes\n";
print "TEST3\n";
(@processes) = @{$ds->{rules}} || die "unable to get rules form config.. \n";
print Dumper(\@processes);
print "@processes\n";
输出:
TEST2
$VAR1 = [
{
'bar' => '1',
'baz' => '1',
'var' => '1'
},
{
'bar' => '2',
'baz' => '2',
'var' => '2'
}
];
HASH(0x25eea68) HASH(0x260b240)
TEST3
$VAR1 = [
2
];
2
比较TEST2和TEST3。尽我所知,即使我在左手边加上括号,只要在末尾添加|| die '.... '
位,就可以更改该语句在标量上下文中的求值方式。 第一季度:也许我只是很稠密,但是为什么会这样呢?
第二季度:在进行列表分配时,是否仍然可以使用“ || die ....”成语/等效词?
答案 0 :(得分:10)
之所以强制标量上下文,是因为||
binds stronger than =
,所以
(@processes) = @{$ds->{rules}} || die "unable to get rules form config.. \n";
解析为
(@processes) = (@{$ds->{rules}} || die "unable to get rules form config.. \n");
然后||
创建一个布尔上下文。但是perl具有a weakly binding version of ||
:
(@processes) = @{$ds->{rules}} or die "unable to get rules form config.. \n";
将以您期望的方式进行解析。