示例:
for my $key ( keys %DNS_CSV_FILES){
for my $file (@$DNS_CSV_FILES{$key}){
print $file;
}
}
给出错误:
Global symbol "$DNS_CSV_FILES" requires explicit package name (did you forget to declare "my $DNS_CSV_FILES"?) at dns.pl line 41.
Execution of dns.pl aborted due to compilation errors.
但是这个代码:
for my $key ( keys %DNS_CSV_FILES){
for my $file (@{$DNS_CSV_FILES{$key}}){
print $file;
}
}
给出所需的输出:
file1.txtfile2.txt
@$x{ $key }
是@{ $x }{ $key }
的缩写,而不是@{ $x{ $key } }
。
请参阅Perl取消引用语法。特别是脚注[1]。curlies只能在一个简单的标量变量周围省略。
CCD_ 4与CCD_。但这并不是这两个片段所使用的。
第一种是使用@$x{ $key }
,它是@{ $x }{ $key }
的缩写。
CCD_ 8和CCD_。
@foo{ $key }
是命名数组的切片,因此@{ ... }{ $key }
是引用数组的切片。因此CCD_ 12是标量CCD_。
@foo
是由名称提供的数组,因此@{ ... }
是被引用的数组。因此CCD_ 16是由散列元素CCD_。
简而言之,Perl的取消引用语法将大括号放在引用周围。但是,如果引用是简单的标量(如$value
(,则可以省略大括号。对于其他任何事情,包括哈希键查找,都需要保留大括号。
这是老式的"环绕";符号Perlv5.24稳定了后缀解引用语法。
此
@$DNS_CSV_FILES{$key}
从左侧将看到一个数组sigil@
,后面跟着一个标量$
。这只能是对数组引用的取消引用。否则,@
是语法错误。尽管你把散列符号放在最后。在某种程度上,这是一种种族状况。因此,它将假设后面的内容是标量,而不是哈希值。
当你通过添加额外的括号来澄清时,的意图就变得很清楚了
@{ $DNS_CSV_FILES{$key} }
@{ }
内部的内容必须是数组ref,$....{key}
必须是哈希值。