Компактный способ получения контрольной суммы файла в Perl
Я ищу способы получить контрольные суммы файлов в Perl, но не путем выполнения системной команды cksum
-- хотел бы сделать это в Perl, потому что скрипт должен быть переносимым между UNIX и Windows. cksum <FILENAME> | awk '{ print }'
работает в UNIX, но, очевидно, не в Windows. Я исследовал MD5 в но кажется, что получение дескриптора файла необходимо, и обычно это не кажется очень компактным способом получить эти данные (предпочтительнее однострочный).
есть лучше способ?
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";
не полностью однострочный, но довольно близко.
заменить Digest::MD5
С любым хэш-алгоритмом, который вы хотите, например SHA1.
IO::File
находится в ядре и должен быть доступен везде, но это решение мне лично не нравится больше всего. В любом случае, это работает.
Я не мог сделать что-либо из вышеперечисленного для меня в 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...
Это также работает:
use Digest::MD5 qw(md5_base64);
...
open(HANDLE, "<", $dirItemPath);
my $cksum = md5_base64(<HANDLE>);
print "\nFile checksum = ".$cksum;