【问题标题】:Perl - map-each-function_returning_hash - command does not work as one linerPerl - map-each-function_returning_hash - 命令不能作为一个班轮工作
【发布时间】:2023-03-22 09:58:01
【问题描述】:

我有返回数组哈希的函数:

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;

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

【问题讨论】:

  • 您应该知道,如果您将子例程的返回值存储在哈希中,您可能会覆盖重复的键。如果这应该是一个哈希,这不是问题。您可能会发现返回哈希引用比返回列表更可取。

标签: perl


【解决方案1】:

您的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;

【讨论】:

  • is_needle_in_haystack() 怎么可能返回列表而不是哈希?当您检查第一个 Data::Dumper 输出时,它显示哈希不是列表还是我错了? is_needle_in_haystack() 中的最后一行也以:%return_h 结尾
  • @WakanTanka 请注意,您使用了 {} 大括号,它们可以有效地生成 hashref。
  • 这是调试器的输出:DB print ref \%return_h HASH
  • 是的,我看到用 {} 或 [] 包装变量我可以得到另一种类型,但正如我所说,我正在返回 %return_h ,它之前构造为 $return_h{$haystack_key} = $haystack_value;
  • @WakanTanka 当你像在调试器中那样反斜杠哈希时,它引用了变量。
【解决方案2】:

我有返回数组哈希的函数:

您的 sub 不返回数组的哈希值。您在Dumper 输出中看到的散列是由{ } 在您的子外部构造的。您的 sub 返回一个由字符串对和数组引用组成的标量列表。

is_needle_in_haystack() 怎么可能返回列表而不是哈希?

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

如果您返回了对哈希的引用,则可以这样做

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多