6

我正在寻找在 Perl 中获取文件校验和的方法,但不是通过执行系统命令cksum——我想在 Perl 本身中进行,因为脚本需要在 UNIX 和 Windows 之间移植。cksum <FILENAME> | awk '{ print $1 }'适用于 UNIX,但显然不适用于 Windows。我已经探索过MD5,但似乎获取文件句柄是必要的,而且通常它似乎不是一种非常紧凑的获取数据的方法(最好是单行)。

有没有更好的办法?

4

3 回答 3

14

以下是三种不同的方式,具体取决于您可用的模块:

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是核心,应该随处可用,但这是我个人最不喜欢的解决方案。无论如何,它有效。

于 2012-12-08T19:14:05.403 回答
7

我无法在 Windows 中为我完成上述任何工作,我总是会得到一个不正确的 MD5。我怀疑它是由换行符的差异引起的,但是将文件转换为 DOS 或 unix 没有任何区别。具有相同文件的相同代码将在 linux 上给我正确的答案,而在 windows 中给我错误的答案。阅读文档,我终于找到了适用于 windows 和 linux 的东西:

use Digest::MD5;
open ($fh, '<myfile.txt');
binmode ($fh);
print Digest::MD5->new->addfile($fh)->hexdigest;

我希望这可以帮助其他在 Windows 上遇到困难的人,我觉得这很奇怪,以至于我没有发现任何关于 Windows 问题的提及......

于 2014-11-18T01:07:08.740 回答
1

这也有效:

use Digest::MD5 qw(md5_base64);
...
            open(HANDLE, "<", $dirItemPath);
            my $cksum = md5_base64(<HANDLE>);
            print "\nFile checksum = ".$cksum; 
于 2012-12-08T20:40:08.367 回答