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

This node falls below the community's threshold of quality. You may see it by logging in.

Replies are listed 'Best First'.
Re^6: file compare and populate
by gu (Beadle) on Dec 05, 2005 at 13:58 UTC
    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
      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