Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compact way of getting file checksum in Perl

Tags:

perl

checksum

I am looking for ways to get file checksums in Perl but not by executing the system command cksum -- would like to do it in Perl itself because the script needs to be portable between UNIX and Windows. cksum <FILENAME> | awk '{ print $1 }' works on UNIX but obviously not in Windows. I have explored MD5 but it seems like getting a file handle is necessary and generally it doesn't seem like a very compact way to get that data (one-liner preferable).

Is there a better way?

like image 877
amphibient Avatar asked Dec 08 '12 19:12

amphibient


1 Answers

Here are three different ways depending on which modules you have available:

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

Not completely one-line but pretty close.

Replace Digest::MD5 with any hash algorithm you want, e.g. SHA1.

IO::File is in core and should be available everywhere, but that's the solution I personally dislike the most. Anyway, it works.

like image 114
Moritz Bunkus Avatar answered Sep 24 '22 07:09

Moritz Bunkus