在这段代码片段中:
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});
我发现'(‘之后的’@’在foreach中导致这不能正确循环,我不知道为什么这个代码甚至没有结束括号,这是什么呢?它在做什么?一个新的变量在飞行,但不应该“使用严格”已经开火或什么?
请帮忙解释一下“@(”正在做什么,为什么它仍然运行没有一个圆括号.
解决方法
这是%(变量)的哈希片段,它是*(glob的一部分),不受严格的vars的限制,对于Perl已经预定义的变量(在这种情况下为$)(也是所有其他的全部位置)所有标点符号变量在所有包中都是全局的,其全限定名称是简写形式:$),@),%),&)…由于严格的“vars”不适用于完全限定名称,这些名称都不是错误.
扩大一点:
@({$r}; @{(}{$r}; @{'main::('}{$r}; # needs strict refs to be off
这些行都是等价的.
使用警告; perl会让你知道用$sigil写一个单一值的片段会更好:
$({$r}; ${(}{$r}; ${'main::('}{$r}; # needs strict refs to be off
哪个在尝试解决错字时会指出你在正确的地方.这就是为什么你应该始终使用警告和限制.
有关更多详细信息,perlvar手册页将显示至少有一个sigil或所有标点符号变量.如果您想要一个关于标点符号变量范围的参考,那么package文档就是这样.