将数组存储为关联数组中的值

时间:2010-05-11 09:06:48

标签: perl

我有一个问题,我需要将一个数组作为关联数组中的值。

浏览下面的代码。在这里,我试图循环目录中的文件,并且更有可能的是,多个文件可以具有相同的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;
       }
    }
}

1 个答案:

答案 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
}