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

标签 perl idioms dereference

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

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/

相关文章:

python - 代理模式习语

java - 使用Java在 map 中自动创建缺失值的成语

c - 为什么最高的元素没有返回?

c - 如何取消引用 ASM 数据段中的指针?

perl - 使用 perl 表达式查找字符串中的最小模式

perl - 为什么这个 Perl 洗牌函数不洗牌?

c++ - 无法理解零规则中的 C++11 语法

c - C 中的指针操作和运算符优先级

perl - 在 perl 项目中使用 maven

linux - Perl脚本: Removing self deplicate rows