6

システム コマンドを実行するのではなく、Perl でファイル チェックサムを取得する方法を探していますcksum。スクリプトは UNIX と Windows 間で移植可能である必要があるため、Perl 自体で実行したいと考えています。cksum <FILENAME> | awk '{ print $1 }'UNIX では動作しますが、明らかに Windows では動作しません。私はMD5を調べましたが、ファイルハンドルを取得する必要があるようで、一般的にそのデータを取得するための非常にコンパクトな方法ではないようです(ワンライナーが望ましい)。

より良い方法はありますか?

4

3 に答える 3

14

使用可能なモジュールに応じて、次の3つの方法があります。

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";

完全に1行ではありませんが、かなり近いです。

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 に答える