in reply to Re^5: file compare and populate
in thread file compare and populate

Ok. So you have to split the hashes from file1 and file2.

The following code should do it :
open FIRST,"file1" or die "Can't open file1: $!\n"; open LAST,"file2" or die "Can't open file2: $!\n"; my (%names1,%names2) ; my $write_new = 0 ; while (<FIRST>) { /(\w*) (\d*)/ ; $names1{$1} = $2 ; } close FIRST; while (<LAST>) { /(\w*) (\d*)/ ; if (!defined($names1{$1})) { $write_new++ ; } $names2{$1} = $2 ; } close LAST; if ($write_new) { open NEW,">","file3" or die "Can't open file3: $!\n"; foreach (sort keys %names2) { if (defined($names1{$_})) { print NEW "$_ $names1{$_}\n" ; } else { print NEW "$_ $names2{$_}\n" ; } } close NEW ; }
I really feel my codes are dirty and unperlish. Is it just an idea ? Can any wise monk enlighten me about style ? I would be glad receiving cruel remarks about the above code :)

Gu

Replies are listed 'Best First'.
Re^7: file compare and populate
by Anonymous Monk on Dec 05, 2005 at 14:49 UTC
    The if($write_new) block is only activated if there are names in file2 that don't appear in file1
    Hence the following works:-
    open FIRST,"file1" or die "Can't open file1: $!\n"; open LAST,"file2" or die "Can't open file2: $!\n"; my (%names1,%names2) ; my $write_new = 0 ; while (<FIRST>) { /(\w*) (\d*)/ ; $names1{$1} = $2 ; } close FIRST; while (<LAST>) { /(\w*) (\d*)/ ; $names2{$1} = $2 ; } close LAST; open NEW,">","file3" or die "Can't open file3: $!\n"; foreach (sort keys %names2) { if (defined($names1{$_})) { print NEW "$_ $names1{$_}\n" ; } else { print NEW "$_ $names2{$_}\n" ; } close NEW ; }
    It means that file3 is always opened, but I can live with that.
    Thanks for your help