2013-03-07 85 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); 
     } 
    } 
} 
相关问题