in reply to Dealing with diff command within perl

If you use backticks instead of system() you can store the output of diff into an array. If that array is empty, the files are identical. If not, print your header and the array.

  • Comment on Re: Dealing with diff command within perl

Replies are listed 'Best First'.
Re^2: Dealing with diff command within perl
by mbethke (Hermit) on Nov 26, 2011 at 17:58 UTC
    ... and when you get an empty file in one directory and a DVD image in the other, you're in trouble :) Better to use Corion's idea and throw the output away:
    $ret = system("diff >/dev/null -r $some_dir/$f $other_dir/$f"); if(0 == $ret) { # files are the same } elsif(1 == $ret) { # files differ } else { # Error from diff }
    That would still write the whole DVD image to /dev/null in my imaginary case even though it's clear after the first line that there are in fact differences. If that's a real possibility, something like your idea but without reading the whole diff would probably be faster:
    open(my $fh, '-|', "diff -r $some_dir/$f $other_dir/$f") or die "diff +: $!"; my $diff = <$fh>; close $fh; if($diff) { # there were diffs }
    After the first line of output, diff gets a SIGPIPE because we closed it output and dies. One should probably check $? for errors from diff there, too.