1

我在 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

3 回答 3

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);
    }
}
于 2013-03-07T05:20:23.060 回答
3

您需要进行两项更改:

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

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

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

于 2013-03-07T05:21:23.793 回答
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);
        }
    }
}
于 2013-03-07T06:04:35.380 回答