我在哈希中有一个哈希数组,如下所示:
$VAR1 = {
'file' => [
{
'pathname' => './out.log',
'size' => '51',
'name' => 'out.log',
'time' => '1345799296'
},
{
'pathname' => './test.pl',
'size' => '2431',
'name' => 'test.pl',
'time' => '1346080709'
},
{
'pathname' => './foo/bat.txt',
'size' => '24',
'name' => 'bat.txt',
'time' => '1345708287'
},
{
'pathname' => './foo/out.log',
'size' => '75',
'name' => 'out.log',
'time' => '1346063384'
}
]
};
如何在循环中迭代这些“文件条目”并访问其值?是否更容易复制my @array = @{ $filelist{file} };
所以我只有一个哈希数组?
答案 0 :(得分:14)
无需复制:
foreach my $file (@{ $filelist{file} }) {
print "path: $file->{pathname}; size: $file->{size}; ...\n";
}
答案 1 :(得分:4)
Perl中没有哈希数组,只有标量数组。只有当这些标量引用数组或散列时,才会出现一堆语法糖。
在您的示例中,$ VAR1保存对哈希的引用,该哈希包含对包含对哈希的引用的数组的引用。是的,这是一个很大的嵌套处理。另外,外部哈希看起来有点无用,因为它只包含一个值。所以,是的,我认为给内部数组一个有意义的名称肯定会让事情更加清晰。它实际上不是“副本”:只复制引用,而不是内容。以下所有内容都是等效的:
my @files = $VAR1 -> {file} # dereferencing with the -> operator
my @files = ${$VAR1}{file} # derefencing with the sigil{ref} syntax
my @files = $$VAR1{file} # same as above with syntactic sugar
请注意,在使用sigil {ref}语法时,sigil遵循与往常相同的规则:%{$ref}
(或%$ref
)是$ ref引用的哈希值,但%{$ref}
的元素1}}对于给定的key
,${$ref}{key}
(或$$ref{key}
)。大括号可以包含返回引用的任意代码,而短版本只能在标量变量已经存在引用时使用。
一旦你的哈希引用数组在一个变量中,迭代就好了:
for (@files) {
my %file = %$_;
# do stuff with %file
}