我有返回数组散列的函数:
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;
我做错了什么?我需要一些括号或线索是什么?
答案 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()