我有一个问题,我需要将一个数组作为关联数组中的值。
浏览下面的代码。在这里,我试图循环目录中的文件,并且更有可能的是,多个文件可以具有相同的ctrno
。所以,我想看看具有相同ctrno
的所有文件是什么。下面的代码在else条件下给出了“$ctrno_hash[$ctrno] = @arr;
”的错误。同样的情况也适用于if条件。
我是否采用了正确的方法,还是可以采取不同的方式?
sub loop_through_files
{
$file = "@_";
open(INPFILE, "$file") or die $!;
#print "$file:$ctrno\n";
while (<INPFILE>)
{
$line .= $_;
}
if ($line =~ /$ctrno/ )
{
print "found\n";
if ( exists $ctrno_hash[$ctrno])
{
local @arr = $ctrno_hash[$ctrno];
push (@arr, $file);
$ctrno_hash[$ctrno] = @arr;
}
else
{
local @arr;
push(@arr, $file);
$ctrno_hash[$ctrno] = @arr;
}
}
}
答案 0 :(得分:5)
我相信你想要像
这样的东西$ctrno_hash[$ctrno] = \@arr;
这会将数组@arr
变为array reference
。
然后使用
引用以前的推送数组引用@{$ctrno_hash[$ctrno]}
也就是说,如果$array_ref
是数组引用,则构造@{ $array_ref }
将返回数组引用指向的数组。
现在,构造$ctrno_hash[$ctrno]
实际上不是哈希,而是普通数组。为了真正使它成为哈希,你需要大括号而不是方括号:
@{$ctrno_hash{$ctrno} } = \@arr;
同样,您稍后会使用
引用数组@{$ctrno_hash{$ctrno} }
现在,说完了,你可以放弃if ... exists
构造:
if ($line =~ /$ctrno/ )
{
print "found\n";
push @{$ctrno_hash{$ctrno}}, $file
}