Perl script to compare two files

hi,
As such I am new to perl on google search I found a code for Perl script to compare two files and print differences between them and instead of prinintg I want to store the diff. in a outputfile so can sombody provide assistance upon this from where can I edit in script to store the diff in output file..

##!/usr/bin/perl
# file_compare.pl
# Purpose: compare two files and show differences
# usage: file_compare.pl filename1 filename2
use strict;
use warnings;
my $file1 =
  'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\file1.txt';
my $file2 =
  'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\file2.txt';
open( FILE1, "< $file1" ) or die "Can not read file $file1: $! \n";
my @file1_contents = <FILE1>;    # read entire contents of file
close(FILE1);
open( FILE2, "< $file2" ) or die "Can not read file $file2: $! \n";
my @file2_contents = <FILE2>;    # read entire contents of file
close(FILE2);
my $length1 = $#file1_contents;    # number of lines in first file
my $length2 = $#file2_contents;    # number of lines in second file

if ( $length1 > $length2 ) {

    # first file contains more lines than second file
    my $counter2 = 0;
    foreach my $line_file1 (@file1_contents) {
        chomp($line_file1);
        if ( defined( $file2_contents[$counter2] ) ) {

            # line exists in second file
            chomp( my $line_file2 = $file2_contents[$counter2] );
            if ( $line_file1 ne $line_file2 ) {
                print "\nline " . ( $counter2 + 1 ) . " \n";
                print "< $line_file1 \n" if ( $line_file1 ne "" );
                print "--- \n";
                print "> $line_file2 \n\n" if ( $line_file2 ne "" );
            }
        }
        else {

            # there is no line in second file
            print "\nline " . ( $counter2 + 1 ) . " \n";
            print "< $line_file1 \n" if ( $line_file1 ne "" );
            print "--- \n";
            print "> \n";    # this line does not exist in file2
        }
        $counter2++;         # point to the next line in file2
    }
}
else {

    # second file contains more lines than first file
    # or both have equal number of lines
    my $counter1 = 0;
    foreach my $line_file2 (@file2_contents) {
        chomp($line_file2);
        if ( defined( $file1_contents[$counter1] ) ) {

            # line exists in first file
            chomp( my $line_file1 = $file1_contents[$counter1] );
            if ( $line_file1 ne $line_file2 ) {
                print "\nline " . ( $counter1 + 1 ) . " \n";
                print "< $line_file1 \n" if ( $line_file1 ne "" );
                print "--- \n";
                print "> $line_file2 \n" if ( $line_file2 ne "" );
            }
        }
        else {

            # there is no line in first file
            print "\nline " . ( $counter1 + 1 ) . " \n";
            print "< \n";    # this line does not exist in file1
            print "--- \n";
            print "> $line_file2 \n" if ( $line_file2 ne "" );
        }
        $counter1++;         # point to next line in file1
    }
}

[mod] [TABLE] isn't suitable for [noparse]

. And correctly formatting your code increases readability a lot

---------- Post updated at 07:45 AM ---------- Previous update was at 07:16 AM ----------

Hi,
Apart from above script I found one more script which will save the diff. in output file.
Suppose a.txt file
 
315: posedge SYS_CLK_IR)
^^^^^^^
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard 
 
170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard 
 
 
202: posedge RD_CLK_IR)
^^^^^^^
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard 
 
 
267: posedge PIXEL_CLK_IR) 
^^^^^^^
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
 
and the second file is a.txt
 
170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
and the diff. of these two will be save in ouput file 1.txt is
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
315: posedge SYS_CLK_IR)
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
267: posedge PIXEL_CLK_IR) 
202: posedge RD_CLK_IR)
 
From output file I canclude its printing the diff of these two file in a random manner not in proper sequence as such in input file.so please help me where is error in code because diff of file is printed randomly.
Hope so I cleared my Problem.
 
#!/usr/bin/perl -W
use strict;
use warnings; 
my $f1 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\2.txt';
my $f2 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\a.txt';
my $outfile = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\1.txt';
my %results = (); 
open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
 $results{$line}++;
}
close(FILE2);  
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;
 

---------- Post updated at 07:46 AM ---------- Previous update was at 07:45 AM ----------

Hi,
Apart from above script I found one more script which will save the diff. in output file.
Suppose a.txt file

315: posedge SYS_CLK_IR)
^^^^^^^
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard

202: posedge RD_CLK_IR)
^^^^^^^
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
Coding Standard

267: posedge PIXEL_CLK_IR)
^^^^^^^
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected

and the second file is 2.txt

170: posedge RD_CLK_IR)
^^^^^^^
vx1_ff_dpram.v:170: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
and the diff. of these two will be save in ouput file 1.txt is
vx1_resizer.v:267: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
315: posedge SYS_CLK_IR)
vx1_fifo_ctrl.v:202: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
vx1_bit_align.v:315: CLOCKS> [WARNING] B_1202: 2 clocks in this unit detected
267: posedge PIXEL_CLK_IR)
202: posedge RD_CLK_IR)

From output file I canclude its printing the diff of these two file in a random manner not in proper sequence as such in input file.so please help me where is error in code because diff of file is printed randomly.
Hope so I cleared my Problem.

#!/usr/bin/perl -W
use strict;
use warnings; 
my $f1 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\2.txt';
my $f2 = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\a.txt';
my $outfile = 'C:\Documents and Settings\dinesh.lohan\Desktop\comparing_file\1.txt';
my %results = (); 
open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
 $results{$line}++;
}
close(FILE2);  
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;
 

The code snippet in your post about the meaning of "unless" had the print command to print to an output file. Have a look at that.
Also check the Perl documentation for the "print" function.

tyler_durden