perl中的|| = []是什么?

Zii*_*Zii 3 arrays perl reference

下面的数组@{$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");
    }
}
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 9

它是一个复合赋值运算符 ; 如果它包含一个假值(即它尚未初始化),它会指定[](对一个新的空数组的引用$violated{$desc}).

这也是完全没必要的,因为无论如何Perl都是自动完成的.||=[]删除相同的代码更清楚地做同样的事情.

但是,有时候做这样的事情确实有意义,所以值得记住这个模式.

  • 术语是"autovivification"http://www.effectiveperlprogramming.com/2011/04/understand-autovivification/ (2认同)

Ama*_*dan 7

$x ||= []相当于差不多$x = $x || [],这一点,反过来,几乎等同于$x = $x ? $x : [].换句话说,如果$x是假的,它将使它成为一个空的数组引用; 否则,它将不管它.