加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 我可以避免引用解除引用地图操作返回的哈希吗?

发布时间:2020-12-16 06:18:11 所属栏目:大数据 来源:网络整理
导读:我有一系列哈希.我想要根据另一个键的唯一性在这些哈希的键中列出值. my @obs = ({ value = 'three',id = 3},{ value = 'one-2',id = 1},{ value = 'one',id = 1});# This works,prints "onenthree"say for values %{{ map { $_-{id} = $_-{value} } @obs }
我有一系列哈希.我想要根据另一个键的唯一性在这些哈希的键中列出值.

my @obs = ({
   value => 'three',id => 3
},{
   value => 'one-2',id => 1
},{
   value => 'one',id => 1
});
# This works,prints "onenthree"
say for values %{{ map { $_->{id} => $_->{value} } @obs }};

我可以避免地图周围的参考解除引用位吗?起初我尝试直接在地图返回时调用值,但Perl不会拥有它:

Type of arg 1 to values must be hash (not map iterator) at scriptworkbench.pl line 55,near “@obs ;”

解决方法

问题是,值确实需要哈希来操作.那是因为它很特别:它清除了每个人使用的占位符.它需要一个实际的对象来清除它.

您可以在这里选择两种方式之一.首先,如果您不喜欢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...

另一种方法可能是模拟临时哈希创建和值正在执行的操作:

my %seen;
for ( reverse @obs ) { say $_->{value} unless $seen{$_->{id}}++ }

真正重要的是你将要对这些数据做些什么.如果您只需要一次倒置哈希的值,那么您的单行可能是最佳解决方案.如果您稍后需要此数据(id& value),则创建实际哈希并使用它 – 不要多次执行此转换,以便您可以将它们保持为单行.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读