2010-05-11 75 views
1

我有一個問題,我需要將數組作爲關聯數組中的值。將數組作爲值存儲在關聯數組中

請仔細閱讀下面的代碼。在這裏我試圖循環目錄中的文件,並且更有可能多於一個文件可以具有相同的ctrno。所以,我想看看具有相同ctrno的所有文件是什麼。以下代碼在else條件中出現「$ctrno_hash[$ctrno] = @arr;」錯誤。同樣的情況下,如果條件也是如此。

我遵循正確的方法,還是可以以不同的方式做?

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; 
     } 
    } 
} 

回答

5

我相信你想要的東西,像

$ctrno_hash[$ctrno] = \@arr; 

這將會把數組@arrarray 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 
} 
+0

謝謝。有效。 – Jagannath 2010-05-11 09:45:28