Perl - map-each-function_returning_hash - 命令不能作为一个班轮使用

时间:2014-09-16 13:05:03

标签: perl

我有返回数组散列的函数:

print Dumper { &is_needle_in_haystack( \@model_groups_names, \%groups_by_name_HoA ) };

$VAR1 = {    # Condensed
    'ng_a2' => [ 'ng_a2', '*', 143, ],
    'ng_b3' => [ 'ng_b3', '*', 144, '' ],
    'ng_g1' => [ 'ng_g1', '*', 158, ],
    'ng_a1' => [ 'ng_a1', '*', 143, ],
    'ng_d2' => [ 'ng_d2', '*', 155, '' ]
};

从这个输出中我需要[2]数组索引上的数字。我试过这个:

print Dumper map {$_->[2]} values &is_needle_in_haystack(\@model_groups_names, \%groups_by_name_HoA)

还尝试了这个部分解决方案,但也没有返回任何结果:

print Dumper values &is_needle_in_haystack(\@model_groups_names, \%groups_by_name_HoA);

我必须把它分解成小块以获得所需的输出:

my %HoA = &is_needle_in_haystack(\@model_groups_names, \%groups_by_name_HoA);
my @A = values %HoA;
my @gid = map {$_->[2]} @A;

print Dumper @gid

$VAR1 = 143;
$VAR2 = 144;
$VAR3 = 158;
$VAR4 = 143;
$VAR5 = 155;

我做错了什么?我需要一些括号或线索是什么?

2 个答案:

答案 0 :(得分:2)

您的is_needle_in_haystack()函数返回列表,您只能在哈希变量上调用values。其中一个解决方案是创建哈希引用,并立即取消引用它%{{ <list> }}

my @gid = map { $_->[2] } values %{{ is_needle_in_haystack(\@model_groups_names, \%groups_by_name_HoA) }};

不过,这是我个人的最爱,

my %HoA = is_needle_in_haystack(\@model_groups_names, \%groups_by_name_HoA);
my @gid = map { $_->[2] } values %HoA;

答案 1 :(得分:2)

  

我有返回数组散列的函数:

您的sub不会返回数组的哈希值。您在Dumper输出中看到的哈希是在{ }之外构建的。你的sub返回一组由字符串和数组引用组成的标量。

  

is_needle_in_haystack()如何返回列表而不是哈希?

嗯,对于初学者来说,潜艇不可能返回哈希。唯一认为子可以返回的是标量列表。 (在标量上下文中,该列表必须恰好是一个标量长。)

如果您返回了对哈希的引用,那么您可以完成

map { $_->[2] } values %{ is_needle_in_haystack() }

但你没有,所以你需要像Dumper那样创建哈希值。

map { $_->[2] } values %{ { is_needle_in_haystack() } }

实际上,你不是。您可以从返回的列表中提取所需内容而无需提取 哈希首先。

my $i;  map { $_->[2] } grep { ++$i % 2 } is_needle_in_haystack()

map { $_->[2] } grep { ref($_) } is_needle_in_haystack()