我有一大堆哈希。我想要一个基于另一个键唯一性的哈希键中值的列表。
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没有:
类型的arg 1到值必须是script\workbench.pl第55行的散列(而不是映射迭代器),靠近"@obs ;"
发布于 2011-04-06 01:28:28
问题是,values真的非常非常想要一个哈希操作。这是因为它是特殊的:它清除了each使用的位置保持器。它需要一个实际的对象才能打开它。
你可以走两条路。首先,如果您不喜欢ref/deref,可以从一行代码中提取临时散列的创建(请为实际代码选择一个比%h更好的名称):
my %h = map { $_->{id} => $_->{value} } @obs;
say for values %h;如果您不希望%h在这里逗留,只需将其放置在临时块中即可:
...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 & value),那么创建实际的散列并使用它--不要只进行一次以上的转换,这样就可以将它们保持为一行。
如果没有进一步的背景,就很难就采取哪种方法提出建议。
发布于 2011-04-07 06:24:22
如果values要处理一个列表,那么它将占用该列表中的每一个元素。所以
say for values %{{ map { $_->{id} => $_->{value} } @obs }};将会是
say for every_odd map { $_->{id} => $_->{value} } @obs;现在,编写这样的函数是完全可能的,但在这种情况下根本不需要它。一个人可以简单地做
say for map { $_->{value} } @obs;这就简化了
say $_->{value} for @obs;一个问题是:不使用散列,就不会消除重复项。
https://stackoverflow.com/questions/5559408
复制相似问题