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


以上是Perl没有用“”选择定义的值在子程序或散列中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>