2013-03-07 134 views
1

我在Perl中遇到了一個很小的難題。爲哈希鍵值創建一個數組(Perl)

我正在閱讀某個文本文件以瞭解某些信息。在閱讀文本文件時,我從文本中選擇了一些鍵;隨着我進一步閱讀,我希望爲鍵保存一組值。

參見例如

Alpha 1 

Something: 2132 
Something: 2134 

Alpha 2 

Something: 2132 
Something: 2134 

我文件讀入到一個數組稱爲線:

my $h; 
my $alpha; 
for my $line (@lines){ 
    if ($line =~ m/Alpha (\d+)/){ 
     $alpha = $1; 
     $h->{$alpha} =(); # create empty array for key? 
    } 
    elsif ($line =~ m/Something: (\d+)/){ 
     push($h->{$alpha}, $1); 
    } 
} 

顯然,它給了我一個錯誤:

Type of arg 1 to push must be array (not hash element) at test.pl line 28, near "$1)" 
Execution of test.pl aborted due to compilation errors. 

無法想出解決辦法。

回答

4

散列鍵值只能包含標量。如果你想存儲一個數組,那麼你需要去數組引用。

你可以做這樣的事情:

for my $line (@lines){ 
    if ($line =~ m/Alpha (\d+)/){ 
     $alpha = $1; 
     $h->{$alpha} = []; # create empty array refernece for key 
    } 
    elsif ($line =~ m/Something: (\d+)/){ 
     push(@{$h->{$alpha}}, $1); 
    } 
} 
+0

太好了。我現在明白了。謝謝。 – p0lAris 2013-03-07 05:23:19

+0

測試用例:'$ alpha'可能會保留'undef'。這不應該被照顧嗎? – 2013-03-07 05:57:55

3

你需要做出兩個改變:

$h->{$alpha} = []; 
        ** - Create an anonymous array and store 
         a ref to it in the hash 

而且

push(@{$h->{$alpha}}, $1); 

因爲push需要一個實際的數組,你有數組引用。 @ {...}包裝器將arrayref解引用爲實際的數組。

0

正如前面的答案所說,他們是正確的。但不完美。 $alpha可能仍然爲undef。因此,爲了避免它,請添加一個check

my $alpha; 
for my $line (@lines){ 
    if ($line =~ m/Alpha (\d+)/){ 
     $alpha = $1; 
     $h->{$alpha} = []; # create empty array refernece for key 
    } 
    elsif ($line =~ m/Something: (\d+)/){ 
     if(defined $apha) { ## Check 
      push(@{$h->{$alpha}}, $1); 
     } 
    } 
} 
相關問題