在哈希(Perl)中为键值创建数组

时间:2013-03-07 05:07:34

标签: perl hash

我在Perl中遇到很小的困难。

我正在阅读一个文本文件,其中包含一些信息。当我读取文本文件时,我从文本中选择一些键;当我进一步阅读时,我希望为键保存一组值。

参见例如

Alpha 1

Something: 2132
Something: 2134

Alpha 2

Something: 2132
Something: 2134

我将文件读入一个名为lines的数组:

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.

无法弄清楚这一点。

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

您需要进行两项更改:

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

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

因为push需要一个实际的数组,并且你有一个数组引用。 @ {...}包装器将arrayref取消引用到实际数组。

答案 2 :(得分: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);
        }
    }
}