在Perl中,为什么在语句上加上“ || die”会导致它在标量上下文中求值?

时间:2019-06-24 06:01:59

标签: list perl variable-assignment scalar

我终于发现我的代码在标量上下文而不是列表上下文中得到评估,即使我在赋值周围有()。

  • 第一个问题是为什么在表达式/赋值上加上“ || 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 ....”成语/等效词?

1 个答案:

答案 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";

将以您期望的方式进行解析。