首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能避免引用+取消引用映射操作返回的散列吗?

我能避免引用+取消引用映射操作返回的散列吗?
EN

Stack Overflow用户
提问于 2011-04-05 22:38:38
回答 2查看 478关注 0票数 5

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

代码语言:javascript
复制
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 ;"

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-06 01:28:28

问题是,values真的非常非常想要一个哈希操作。这是因为它是特殊的:它清除了each使用的位置保持器。它需要一个实际的对象才能打开它。

你可以走两条路。首先,如果您不喜欢ref/deref,可以从一行代码中提取临时散列的创建(请为实际代码选择一个比%h更好的名称):

代码语言:javascript
复制
my %h = map { $_->{id} => $_->{value} }  @obs;
say for values %h;

如果您不希望%h在这里逗留,只需将其放置在临时块中即可:

代码语言:javascript
复制
...code code code...
{
    my %h = map { $_->{id} => $_->{value} }  @obs;
    say for values %h;
}
...code code code...

另一种方法可能是模拟临时哈希创建和values正在做什么:

代码语言:javascript
复制
my %seen;
for ( reverse @obs ) { say $_->{value} unless $seen{$_->{id}}++ }

真正重要的是你将如何处理这些数据。如果你只需要你的倒排哈希值一次,那么你的一行可能是最好的解决方案。如果稍后需要这些数据(id & value),那么创建实际的散列并使用它--不要只进行一次以上的转换,这样就可以将它们保持为一行。

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

票数 7
EN

Stack Overflow用户

发布于 2011-04-07 06:24:22

如果values要处理一个列表,那么它将占用该列表中的每一个元素。所以

代码语言:javascript
复制
say for values %{{ map { $_->{id} => $_->{value} } @obs }};

将会是

代码语言:javascript
复制
say for every_odd map { $_->{id} => $_->{value} } @obs;

现在,编写这样的函数是完全可能的,但在这种情况下根本不需要它。一个人可以简单地做

代码语言:javascript
复制
say for map { $_->{value} } @obs;

这就简化了

代码语言:javascript
复制
say $_->{value} for @obs;

一个问题是:不使用散列,就不会消除重复项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5559408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档