我有一个哈希数组。我想要一个基于另一个键的唯一性的哈希键中的值列表。
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/