in reply to comparing files

# First suggestion: add error checking. open (ONE, $file1) or die "Couldn't open $file1: $!\n"; open (TWO, $file2) or die "Couldn't open $file2: $!\n"; # 2nd suggestion: check syntax. while ($line1 = <ONE>) { # 3rd suggestion: eliminate unneeded loops. $line2 = <TWO>; # 4th suggestion: don't chomp if you don't need to. # 5th suggestion: If you don't need the whole array, don't keep it +. $element1 = (split ' ', $line1, 2)[0]; $element2 = (split ' ', $line2, 2)[0]; # 6th suggestion: Handle either or both cases. if ($element1 ne $element2) { print "$element1 does not equal $element2 at line $.\n"; } else { print "$element1 is the same in both files at line $.\n"; } }
-sauoq
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re: Re: comparing files
by Anonymous Monk on Aug 23, 2002 at 15:28 UTC
    thanks for the help....basically if i have two files, and for every name that matches in the first column (not necessarily the same number of lines in the two files), i want to print out the second and third columns of the second file.....does code in the previous posting make sense? so i have file 1:
    case1 23 home case2 45 match
    and file 2:
    case0 22 match case5 55 home case2 32 match
    so i want my file to print out
    case2 32 match
    thanks for the all the help
      perldoc -q contain
      Found in /usr/lib/perl5/5.6.0/pod/perlfaq4.pod How can I tell whether a list or array contains a certain element? Hearing the word "in" is an indication that you probably should have used a hash, not a list or array, to store your data...
      Populate a hash with the keys as the values of the first column of the first datafile, then loop through the second file and check for the existence of the corresponding number in the hash, as such: (I used pattern matching 'cause that's the first thing that popped into my head, but you can use whatever's best for your particular datafile.)
      my %h1; while (<ONE>) { $h1{$1} = $2 if /^(\d)+\s+(.+)/; } while (<TWO>) { /^(\d)+\s+(.+)/; printf "Match: %s\t%s\n", $1, $2 if exists $h1{$1};
      I don't know how efficient this is, but it works. HTH.

      --

      There are 10 kinds of people -- those that understand binary, and those that don't.