在Perl中,"||=[]"是什么意思?

3
在下面的子程序中,@{$violated{$desc}||=[]}数组是什么意思?尽管我理解@{$violated{$desc}}是由$violated{$desc}引用的匿名数组。
sub not_in_file_ok {
    my ($filename, %regex) = @_;
    open( my $fh, '<', $filename ) or die "couldn't open $filename for reading: $!";
    my %violated;
    while (my $line = <$fh>) {
        while (my ($desc, $regex) = each %regex) {
            if ($line =~ $regex) {
                push @{$violated{$desc}||=[]}, $.;
            }
        }
    }
    if (%violated) {
    fail("$filename contains boilerplate text");
    diag "$_ appears on lines @{$violated{$_}}" for keys %violated;
    } else {
    pass("$filename contains no boilerplate text");
    }
}

2
在 perlop 中检查 ||=[] 返回数组引用。如果清晰度很重要,应该写成 $violated{$desc} ||= []; push @{$violated{$desc}}, $.; - mpapec
3个回答

9
这是一个复合赋值运算符;如果$violated{$desc}包含false值(即尚未初始化),它会将[](对新空数组的引用)分配给$violated{$desc}
此外,这是完全不必要的,因为Perl会自动执行。删除||=[]后,相同的代码可以更清晰地完成相同的操作。
然而,在某些情况下,实际上做这样的事情是有意义的,所以值得记住这个模式。

2
术语是“自动存活”http://www.effectiveperlprogramming.com/2011/04/understand-autovivification/ - Sobrique

7

$x ||= [] 的含义基本等同于 $x = $x || [],而后者几乎等同于 $x = $x ? $x : []。换句话说,如果 $x 是 falsy(假值),它将使其成为一个空数组引用;否则,它将保持不变。


2

逻辑或赋值。它接受左操作数和右操作数,执行 left || right 并将结果赋回到 left

请查看Perl 赋值运算符


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接