什么是'@('在这个Perl代码中做什么?

Ant*_*key 9 perl variable-declaration

在此代码段中:

    use strict;
    use warnings;
    use Data::Dumper;
    my $r = [qw(testing this thing)];

    print Dumper($r);
    foreach my $row (@({$r})
    {
        print "$row\n";
        $row .= 'mod';
    }
    print Dumper($r);
    print Dumper(@({$r});
Run Code Online (Sandbox Code Playgroud)

我发现foreach 中的' ('之后' @'导致它无法正确循环.我不知道为什么这个代码甚至可以工作,因为没有结束括号.这是做什么的?它看起来是在动态创建一个新的变量,但不应该use strict"已经解雇了什么?

请帮助解释一下这@(是什么以及为什么它仍然在没有结束括号的情况下运行.

Eri*_*rom 8

这是%(变量的哈希切片,它是*(glob的一部分,不受严格的变量的限制.对于Perl已预定义的变量(在这种情况下)$(以及标点符号变量名称的所有其他glob时隙也是如此.所有的标点变量在所有包全局的,它们完全合格的名称缩写形式:$),@),%),&)...由于strict 'vars'并不适用于完全合格的名称,这些名称没有错误是.

扩大一点:

@({$r};
@{(}{$r};
@{'main::('}{$r};  # needs strict refs to be off
Run Code Online (Sandbox Code Playgroud)

那些线都是等价的.

使用use warnings;perl会让你知道用一个$sigil 写一个单一值的片段会更好:

$({$r};
${(}{$r};
${'main::('}{$r};  # needs strict refs to be off
Run Code Online (Sandbox Code Playgroud)

在试图解决拼写错误时,会指出你在正确的位置.这就是为什么你应该总是同时使用警告和限制.

有关更多详细信息,perlvar联机帮助页显示了至少有一个或多个符号的所有标点符号变量.如果你想要一个关于标点符号变量范围的参考,那么文档就有了.


所有标点符号变量也不受used only once警告的影响,这可能是一个错误......