在perl中解析数​​组数组

时间:2014-03-24 21:40:30

标签: arrays perl

我正在尝试解析一个数组数组,但是我收到了错误

Reference found where even-sized list expected

以下是该计划:

use Modern::Perl;

my @info=(
      ['k1','v1',1,2],
      ['k2','v2',2,3]
    );

my %names=getNames(\@info);

sub getNames {
    my ($info) = @_;
    my %names;
    foreach my $item (@$info) {
       $names{@$item[0]}=@$item[1];
    }
    return \%names;
}

2 个答案:

答案 0 :(得分:3)

正如Ivan所指出的,您的return值与您分配的值不符:

my %names = getNames(\@info);

sub getNames {
    ...
    return \%names;
}

%names排除了偶数个元素,因为它是一个哈希值,但是你要为它分配一个哈希引用,这是一个单独的元素。因此错误。

你的子程序的这一行也有点怀疑:$names{@$item[0]}=@$item[1];。也许您打算使用$names{$item->[0]}=$item->[1];

如果您尝试将数组数组转换为带有指向其余值的键的哈希值,则可以使用以下命令:

my @info=(
      ['k1','v1',1,2],
      ['k2','v2',2,3],
    );

my %names = map {$_->[0] => [@{$_}[1..$#$_]]} @info;

use Data::Dump;
dd \%names;

输出:

{ k1 => ["v1", 1, 2], k2 => ["v2", 2, 3] }

但是,如果您只想要第一个"值",那么以下就足够了:

my %names = map {$_->[0] => $_->[1]} @info;

答案 1 :(得分:2)

问题在于您尝试将哈希引用分配给哈希my %names=getNames(\@info);。将其更改为参考:

my $names = getNames(\@info);

或者返回哈希:

return %names;