use strict; use warnings; use Carp; use Digest::SHA1 'sha1'; my $textfile= $ARGV[0]; my $messagefile= $ARGV[1]; # File::Slurp doesn't do binmode. sub read_file { my ($file, $discipline) = @_; my $F; my $r; my (@r); open($F, "<$file") || croak "open $file: $!"; binmode ($F, $discipline) if defined $discipline; @r = <$F>; close($F); return @r if wantarray; return join("",@r); } # read in the files. my @text= read_file ($textfile); my $message= read_file ($messagefile, ":raw") if $messagefile; sub digest { my ($line, $desired, $n)= @_; my $result= vec(sha1($line), 1, 1); my $indicator= $desired==$result ? "ok" : "**"; return "$desired $result $indicator"; } # figure each line open (my $output, ">$textfile") or die; my $n= 0; # count text lines / message bits foreach my $line (@text) { # if the line begins with '.[' it has been processed before. Strip that stuff off. $line =~ s/^\.\[[^\]]+\]\s//; # don't count trailing/leading whitespace ($line) = $line =~ /^\s*(.*[^\s])\s*$/; if (!defined $line || $line eq '') { # blanks are not significant print {$output} "\n"; next; } if (defined $messagefile) { my $bit= vec ($message, $n, 1); my $report= digest ($line, $bit, $n); print {$output} ".[$report] $line\n"; } else { # I'm stripping the annotations print {$output} "$line\n"; } ++$n; }