perl中的@{$value}和@$value之间有什么区别



示例:

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}必须是哈希值。

最新更新