2012-12-08 18 views
6

Szukam sposobów na uzyskanie sum kontrolnych pliku w Perlu, ale nie przez wykonanie polecenia systemowego cksum - chciałbym zrobić to w samym Perlu, ponieważ skrypt musi być przenośny między UNIX i Windows. cksum <FILENAME> | awk '{ print $1 }' działa w systemie UNIX, ale oczywiście nie w systemie Windows. Zbadałem MD5, ale wydaje się, że uzyskanie uchwytu pliku jest konieczne i generalnie nie wydaje się bardzo kompaktowy sposób na uzyskanie tych danych (najlepiej jeden liner).Kompaktowy sposób na uzyskanie sumy kontrolnej pliku w Perl

Czy istnieje lepszy sposób?

Odpowiedz

12

Oto trzy różne sposoby, w zależności od których masz dostępne moduły:

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

Nie całkowicie jedna linia, ale dość blisko.

Zamień Digest::MD5 z dowolnym algorytmem hashowania, np. SHA1.

jest w centrum i powinien być dostępny wszędzie, ale to rozwiązanie, którego osobiście najbardziej nie lubię. W każdym razie to działa.

+0

Nie mogłem znaleźć File :: Slurp w 'ppm' – amphibient

+3

jest OK - działało to tak:' open (HANDLE, "<", $ dirItemPath); my $ cksum = md5_hex (); ' – amphibient

+0

Zaktualizowałem swoje odpowiedzi z większą liczbą opcji. –

1

Działa to również:

use Digest::MD5 qw(md5_base64); 
... 
      open(HANDLE, "<", $dirItemPath); 
      my $cksum = md5_base64(<HANDLE>); 
      print "\nFile checksum = ".$cksum; 
5

nie mogłem zrobić żadnej z powyższych prac dla mnie w oknach, ja zawsze się nieprawidłową MD5. Podejrzewałem, że jest to spowodowane różnicami w linii, ale konwersja pliku na DOS lub na unix nie miała znaczenia. Ten sam kod z tym samym plikiem dałby mi właściwą odpowiedź na linuxie i niewłaściwą w Windows. Czytanie dokumentacji, w końcu znalazłem coś, co będzie działać zarówno w Windows i Linux:

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

Mam nadzieję, że to pomoże innym ludziom mających trudności w oknach, uważam, że to bardzo dziwne, że nie znaleźliśmy żadnych problemów wymienia na windows ...