我正在寻找在Perl中获取文件校验和的方法,但不是通过执行系统命令cksum
- 想在Perl本身中这样做,因为脚本需要在UNIX和Windows之间移植。 cksum <FILENAME> | awk '{ print $1 }'
适用于UNIX,但显然不适用于Windows。我已经探索了MD5,但似乎需要获取文件句柄,并且通常它似乎不是一种非常紧凑的方式来获取该数据(单行优先)。
有更好的方法吗?
答案 0 :(得分:13)
根据您可用的模块,有三种不同的方式:
use Digest::MD5 qw(md5_hex);
use File::Slurp;
print md5_hex(read_file("filename")), "\n";
use IO::All;
print md5_hex(io("filename")->all), "\n";
use IO::File;
print md5_hex(do { local $/; IO::File->new("filename")->getline }), "\n";
不是完全一行但非常接近。
将Digest::MD5
替换为您想要的任何哈希算法,例如SHA1。
IO::File
是核心,应该随处可用,但这是我个人最不喜欢的解决方案。无论如何,它有效。
答案 1 :(得分:5)
我无法在Windows中为我做任何上述工作,我总是得到一个不正确的MD5。我怀疑它是由于linebreak的差异引起的,但将文件转换为DOS或unix没有任何区别。具有相同文件的相同代码将在linux上给出正确的答案,在Windows中给出错误的答案。阅读文档,我终于发现了一些可以在windows和linux中运行的东西:
use Digest::MD5;
open ($fh, '<myfile.txt');
binmode ($fh);
print Digest::MD5->new->addfile($fh)->hexdigest;
我希望这可以帮助其他人在Windows中遇到困难,我觉得很奇怪,我没有找到任何关于Windows上问题的提及......
答案 2 :(得分:1)
这也有效:
use Digest::MD5 qw(md5_base64);
...
open(HANDLE, "<", $dirItemPath);
my $cksum = md5_base64(<HANDLE>);
print "\nFile checksum = ".$cksum;