我在这里查看了这个链接:How could I write a Perl script to calculate the MD5 sum of every file in a directory?
获取指定目录下每个文件的md5。我想做的就是获取这些 md5 并将它们与数组进行比较。这就是我到目前为止所拥有的。
use warnings;
use strict;
use Digest::MD5 qw(md5_hex);
my $dirname = "./";
opendir( DIR, $dirname );
my @files = readdir(DIR);
closedir(DIR);
print "@files\n";
foreach my $file (@files) {
if ( -d $file || !-r $file ) { next; }
open( my $FILE, $file );
binmode($FILE);
print Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n";
my @array = ('667fc8db8e5519cacbf8f9f2af2e0b08');
if (@array ~~ $FILE) {
print "matches array", "\n";
} else {
print "doesnt match array", "\n";
}
}
system ( 'pause' )
但是这样一来,我总是得到与数组不匹配的结果,无论它是否与数组完美匹配。我可以print @array
,它甚至会显示文件的相同 md5 值。但就像我说的,它总是说“与数组不匹配”。我从来没有在任何文件上说过“匹配数组”。感谢您的浏览:)
编辑: 这就是我现在拥有的。
use warnings;
use strict;
use Digest::MD5 qw(md5_hex);
my $dirname = "./";
opendir( DIR, $dirname );
my @files = readdir(DIR);
closedir(DIR);
print "@files\n";
foreach my $file (@files) {
next if -d $file || !-r $file;
open( my $FILE, $file );
binmode($FILE);
#print digest::MD5->new->addfile($FILE)->hexdigest, " $file\n";
Sdigest = Digest::MD5->new->addfile($FILE)->hexdigest, " $file\n";
my @array = ('667fc8db8e5519cacbf8f9f2af2e0b08');
if($digest eq $array[0]) {
print "matches array", "\n";
} else {
print "doesnt match array", "\n";
}
}
system ( 'pause' );
感谢大家的帮助。你们太棒了;)
最佳答案
请不要使用 smartmatch ~~
。它在最新版本的 Perl 中被宣布为实验性的,并且语义将来可能会发生变化。
最好的解决方案是创建您知道的指纹的哈希值:
my %fingerprints;
$fingerprints{"667fc8db8e5519cacbf8f9f2af2e0b08"} = undef;
如果您想将整个指纹数组加载到哈希中以便我们可以轻松测试是否存在,您可以使用哈希切片:
@fingerprints{@array} = ();
接下来,我们将当前文件的指纹存储在变量中:
my $digest = Digest::MD5->new->addfile($FILE)->hexdigest;
然后我们测试 $digest
是否存在于指纹哈希中:
if (exists $fingerprints{$digest}) {
print "$digest for <$file> -- FOUND\n";
}
else {
print "$digest for <$file>\n";
}
使用哈希通常比循环数组更快(如果您进行多次查找)。
建议的完整程序:
use strict;
use warnings;
use feature qw< say >;
use autodie; # automatic error handling
use Digest::MD5;
my ($dirname, $fingerprint_file) = @ARGV; # takes two command line arguments
length $dirname or die "First argument must be a directory name\n";
length $fingerprint_file or die "Second argument must be a file with fingerprints\n";
# load the fingerprints
my %fingerprints;
open my $fingerprints_fh, "<", $fingerprint_file;
while (<$fingerprints_fh>) {
chomp;
$fingerprints{$_} = undef;
}
close $fingerprints_fh;
opendir my $directory, $dirname;
while(my $file = readdir $directory) {
next if not -f $file;
open my $fh, "<:raw", "$dirname/$file";
my $digest = Digest::MD5->new->addfile($fh)->hexdigest;
close $fh;
if (exists $fingerprints{$digest}) {
say qq($digest "$file" -- FOUND);
}
else {
say qq($digest "$file");
}
}
closedir $directory;
调用示例
> perl script.pl . digests.txt
关于arrays - 将目录中文件的 MD5 与数组进行比较 (perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455999/