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

perl – 如何在迭代时删除哈希元素?

发布时间:2020-12-15 21:33:36 所属栏目:大数据 来源:网络整理
导读:我有相当大的哈希(大约10M的密钥),我想从中删除一些元素. 我通常不喜欢使用删除或拼接,我会复制我想要的,而不是删除我不做的.但这一次,由于哈希非常大,我想我想直接删除它. 所以我在做这样的事情: foreach my $key (keys %hash) { if (should_be_deleted($k
我有相当大的哈希(大约10M的密钥),我想从中删除一些元素.

我通常不喜欢使用删除或拼接,我会复制我想要的,而不是删除我不做的.但这一次,由于哈希非常大,我想我想直接删除它.

所以我在做这样的事情:

foreach my $key (keys %hash) {
 if (should_be_deleted($key)) {
  delete($hash{$key});
 }
}

似乎可以正常工作.但是,如果我想删除一些元素,甚至在迭代之前怎么办?我将举例说明:

foreach my $key (keys %hash) {
 if (should_be_deleted($key)) {
  delete($hash{$key});
  # if $key should be deleted,so does "$key.a","kkk.$key" and some other keys
  # I already know to calculate. I would like to delete them now...
 }
}

我想到了一些可能的解决方案,例如检查一个键是否仍然存在,作为循环中的第一步,或者首先循环,并创建要删除的键列表(不实际删除它们),然后在另一个循环中实际删除.

你对此有何想法?

UPDATE

双程方式似乎有一个共识.然而,在第一次通过时,我仔细检查已经标记为删除的键,这是非常低效的.这是有点递归的,因为我不仅检查了密钥,还计算了应该删除的其他密钥,尽管它们已经被原始密钥计算了.

也许我需要使用一些更动态的数据结构来迭代键,这将动态更新?

解决方法

我推荐做两次,因为它更健壮.哈希顺序是有效的随机的,所以不能保证你会在相关的之前看到“主”键.例如,如果should_be_deleted()仅检测到不需要的主键和相关的主键,则可能会最终处理不需要的数据.双程方法避免了这个问题.
my @unwanted;
foreach my $key (keys %hash) {
    if (should_be_deleted($key)) {
         push @unwanted,$key;
         # push any related keys onto @unwanted
    }
}

delete @hash{@unwanted};

foreach my $key (keys %hash) {
    # do something
}

(编辑:李大同)

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

    推荐文章
      热点阅读