【问题标题】:Perl: Compare two hashes, remove keys from onePerl:比较两个哈希,从一个中删除键
【发布时间】:2012-05-30 20:00:18
【问题描述】:

我正在尝试做的事情:

将文件及其 md5 哈希值存储到哈希中,在添加或删除文件时更改哈希。

到目前为止,我能够存储 md5 哈希并在添加文件时更新哈希。 但是我不确定如何删除已删除文件的密钥

我现在的方法是:

将数组转化为哈希值进行比较

my %files = map { $_ => 1 } @files;

检查它们是否相同

if (%files ~~  %hash).. same.. else... different

我不确定如何进一步实施。这是我的想法:

删除哈希中不再有文件的键(伪代码)

Where exists $hash{$_} && !exists $files{$_} delete $hash{$_}

【问题讨论】:

    标签: perl


    【解决方案1】:

    只需循环一个,检查是否存在并删除...

    foreach my $k ( keys %file ) {
      delete $hash{$k} if exists $hash{$k};
    }
    

    此外,由于内部原因,在为此目的使用哈希时,您最好分配 undef 而不是 1 给它。为简单起见保留了原因。

    my %files = map { $_ => undef } @files;
    

    我不确定条件是让它更快还是更慢——这可能无关紧要。

    【讨论】:

    • 我很好奇在哈希中使用 undef 而不是 1。你介意在上面添加一个附录吗?
    • @stevenl undef 在 perl 中存储为 SV_UNDEF,它只是一个指向 NULL(0x0) 的指针,而不是一个 IV,它的开销类似于与它有关的标志(上下文) ,以及如何渲染它。
    【解决方案2】:

    您不需要创建散列来比较列表。看看List::Compare。特别是, get_unique() 和 get_complement() 方法将识别仅出现在两个列表之一中的项目。

    【讨论】:

    • List::Compare 中没有 XS。我怀疑它是否更快,看看它看起来也不令人印象深刻的代码。
    • 我使用 List::Compare::Functional qw( get_complement );这解决了我的问题。我制作了一个键数组,然后比较了两个数组。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 2016-09-05
    • 2011-09-12
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多