use strict; use Digest::MD5; use File::Find; use threads; use threads::shared; # # # ------------------------------------------------------------------ # get time # ------------------------------------------------------------------ my @time        = localtime(); my $time_string = sprintf "%02d.%02d.%02d",          $time[5]+1900, $time[4]+1, $time[3],          $time[2], $time[1], $time[0]; # # # ------------------------------------------------------------------ # threads component # ------------------------------------------------------------------ my $StopDotPrintFlag : shared; sub DotPrintThread   {    my ($Interval, @Trash) = @_;    use IO::Handle;    autoflush STDOUT 1;    my $IntervalCount=0;    while ($StopDotPrintFlag != 2)         {          if ($StopDotPrintFlag == 1)            {              print STDOUT ".";            }          $IntervalCount++;          sleep $Interval;         }          return $IntervalCount;   } # # # ------------------------------------------------------------------ # file details # ------------------------------------------------------------------ my $directory = '.'; my $result_file = "md5_check_$time_string\.txt"; unlink ("$result_file"); # my @files; find(\&get_dir,$directory); # print "\n\tMD5_CHECK.PL powered by R.Hehlert\n"; # # # ------------------------------------------------------------------ # start threads # ------------------------------------------------------------------ $StopDotPrintFlag = 0; my $Interval = 1; print "\n\tStarting 0% ["; my $DotPrintThread = threads->new(\&DotPrintThread, $Interval); $StopDotPrintFlag = 1; # # # ------------------------------------------------------------------ # start main programm # ------------------------------------------------------------------ for my $file(@files)   {    my $md5 = Digest::MD5->new;    open FILE, $file;    binmode(FILE);    while ()         { $md5->add($_);         }     my $digest = $md5->hexdigest;   close FILE;           open(my $fh, ">>$result_file") or die $!;           print $fh "Digest is $digest for $file\n";           close $fh;         } # # # ------------------------------------------------------------------ # stop threads # ------------------------------------------------------------------ $StopDotPrintFlag = 2; my $NumberOfPrintedDots=$DotPrintThread->join; print "\t] 100% applied time was ".$NumberOfPrintedDots*$Interval." seconds\n"; print "\n\tPls. read $result_file for results\n"; # # # ------------------------------------------------------------------ # get all files from all directorys # ------------------------------------------------------------------ sub get_dir   {    push (@files,$File::Find::name);   } #   #END