Perl没有用“”选择定义的值在子程序或散列中
我正在运行一个简单的脚本,如果定义了一个值,它将为一个变量分配一个值,最简单的是:
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':default';
my $x;
my $y = $x || 3;
say $y; # prints 3, as it should, because $x isn't defined
$x = 9;
$y = $x || 3;
say $y; # prints 9, as it should, because $x is defined
但是,当我尝试在子例程中使用相同的语法时,它会反向工作:
sub subr {
my ($args) = @_;
my $min = $args->{min} || 4; # returns 4, not $args->{min}
say $min;
}
subr({
min => 0 # prints 4, not 0
});
与子例程中的哈希值相同的问题是:
my %h = ( 'a' => 0);
$y = $h{a} || 7;
say $y; # prints 7, which isn't correct, it should be 0
if (defined $h{a}) {
$y = $h{a};
} else {
$y = 1;
}
say $y; # 0, which is correct
我在这里做错了什么?为什么
my $var = $something || number
子程序中的散列或散列引用的工作方式不同?
回答
||是 or 运算符。它检查左侧的真实性,而不是定义性。对于测试定义性的二元运算符,您需要//(自 Perl v5.10 起可用)。
更多在 perlop