我在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.
无法弄清楚这一点。
答案 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);
}
}
}