在Perl中获取文件校验和的紧凑方式

时间:2012-12-08 19:09:39

标签: perl checksum

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

有更好的方法吗?

3 个答案:

答案 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;