wes*_*wes 4 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 }};
Run Code Online (Sandbox Code Playgroud)
我可以避免参考+解除引用位map吗?起初我尝试直接调用values返回,map但Perl不会拥有它:
arg 1到values的类型必须是在脚本\ workbench.pl第55行的哈希(不是map迭代器),靠近"@obs;"
问题是,values真的,真的想要哈希操作.那是因为它很特别:它清除了所使用的占位符each.它需要一个实际的对象来清除它.
您可以在这里选择两种方式之一.首先,如果您不喜欢ref/deref,您可以将临时哈希的创建从单行中拉出来(请选择比%h实际代码更好的名称):
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;
Run Code Online (Sandbox Code Playgroud)
如果您不想%h闲逛,只需将其放入临时块:
...code code code...
{
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;
}
...code code code...
Run Code Online (Sandbox Code Playgroud)
另一种方法可能是模拟临时哈希创建和values正在执行的操作:
my %seen;
for ( reverse @obs ) { say $_->{value} unless $seen{$_->{id}}++ }
Run Code Online (Sandbox Code Playgroud)
真正重要的是你将要对这些数据做些什么.如果您只需要一次倒置哈希的值,那么您的单行可能是最佳解决方案.如果需要此数据(ID和值)以后,然后创建实际的哈希和使用 - 不这样做变换不止一次只是,这样就可以让他们为单行.
如果没有进一步的背景,很难就哪种方法提出建议.