gpt4 book ai didi

perl - 我可以避免引用+取消引用从映射操作返回的哈希吗?

转载 作者:行者123 更新时间:2023-12-05 00:04:35 25 4
gpt4 key购买 nike

我有一个哈希数组。我想要一个基于另一个键的唯一性的哈希键中的值列表。

my @obs = ({
value => 'three',
id => 3
},{
value => 'one-2',
id => 1
},{
value => 'one',
id => 1
});
# This works, prints "one\nthree"
say for values %{{ map { $_->{id} => $_->{value} } @obs }};

我可以避免 map 周围的引用 + 取消引用位吗? ?起初我试着调用 values直接从 map返回但是 Perl 没有它:

Type of arg 1 to values must be hash (not map iterator) at script\workbench.pl line 55, near "@obs ;"

最佳答案

问题是 values真的,真的想要一个哈希来操作。那是因为它很特别:它清除了 each 使用的占位符。 .它需要一个实际的对象来清除它。

您可以在这里采取两种方式之一。首先,如果您不喜欢 ref/deref,您可以从单行中提取临时哈希的创建(请为您的实际代码选择一个比 %h 更好的名称):

my %h = map { $_->{id} => $_->{value} }  @obs;
say for values %h;

如果你不想要 %h闲逛,只需将其放入临时 block 中:
...code code code...
{
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;
}
...code code code...

另一种方法可能是模拟您的临时哈希创建和 values。是在做:
my %seen;
for ( reverse @obs ) { say $_->{value} unless $seen{$_->{id}}++ }

真正重要的是您将如何处理这些数据。如果您只需要一次反向哈希的值,那么您的单线可能是最好的解决方案。如果您稍后需要此数据(id 和值),则创建实际的哈希并使用它 - 不要多次执行此转换,以便您可以将它们保留为单行。

如果没有进一步的背景,很难就采取哪种方法给出建议。

关于perl - 我可以避免引用+取消引用从映射操作返回的哈希吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5559408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com