Perl:比较两个哈希,从一个哈希中删除键

Perl:比较两个哈希,从一个哈希中删除键,perl,Perl,我试图做的是: 将文件及其md5哈希值存储到哈希中,在添加或删除文件时更改哈希 到目前为止,我能够存储md5哈希,并在添加文件时更新哈希。 但是,我不知道如何删除已删除文件的密钥 我现在的做法是: 将数组转换为哈希以进行比较 检查它们是否相同 我不知道如何进一步实施这一点。。以下是我的想法: 删除散列中不再有文件的密钥(伪代码) 您不需要创建哈希来比较列表。看一看。特别是,get_unique()和get_complete()方法将识别只出现在两个列表之一中的项目 只需循环一个,检查是否存在并删

我试图做的是:

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

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

我现在的做法是:

将数组转换为哈希以进行比较 检查它们是否相同 我不知道如何进一步实施这一点。。以下是我的想法:

删除散列中不再有文件的密钥(伪代码)
您不需要创建哈希来比较列表。看一看。特别是,get_unique()和get_complete()方法将识别只出现在两个列表之一中的项目

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

foreach my $k ( keys %file ) {
  delete $hash{$k} if exists $hash{$k};
}
此外,由于使用散列进行此操作时的内部结构,您最好将
undef
赋值给它,而不是
1
。简单的理由

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

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

List::Compare
中没有XS。我怀疑它是否更快,从代码上看,它看起来也不令人印象深刻;这解决了我的问题。我制作了一个键数组,然后比较了这两个数组。谢谢我对在散列中使用undef而不是1感到好奇。你介意在上面添加一个附录吗?@stevenl
undef
在perl中存储为
SV_undef
,它只是一个指向
NULL(0x0)
的指针,而不是一个
IV
,它有一些开销,比如关于它是什么(上下文)以及如何呈现它的标志。
Where exists $hash{$_} && !exists $files{$_} delete $hash{$_}
foreach my $k ( keys %file ) {
  delete $hash{$k} if exists $hash{$k};
}
my %files = map { $_ => undef } @files;