Arrays 在perl中解析数组数组

Arrays 在perl中解析数组数组,arrays,perl,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 m

我试图解析一个数组,但我得到了一个错误

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;
}

正如Ivan指出的,您的
返回值与您分配给它的值不匹配:

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;

正如Ivan指出的,您的
返回值与您分配给它的值不匹配:

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;

问题是您试图将哈希引用分配给hash
my%names=getNames(\@info)。将其更改为与参考一起工作:

my $names = getNames(\@info);
或返回哈希:

return %names;

问题是您试图将哈希引用分配给hash
my%names=getNames(\@info)。将其更改为与参考一起工作:

my $names = getNames(\@info);
或返回哈希:

return %names;