use strict; use diagnostics; use warnings; use autodie qw(open close); use Data::Dump qw(dump); #declare variables my %hash; my $data; #opening Files using autodie to cut typing... open my $in, '<', "Test_Data_RandNumbers.txt"; open my $in1, '<', "Test_Data_More_RandNumbers.txt"; open my $out, '>', "OUT_Test_Data_Ita_SpanFren_rest.txt"; open my $out1, '>', "OUT_Test_data_NO_match_SpanFren.txt"; #open my $out2,'>' , "./Test_Data_Out_None_Match.txt"; while (<$in>) { #data manipulation to clean up ='s and ,'s #dieci = diez, zehn -->worse case, remove spaces and = and comma; #quattro = quatro -->only one number with spaces or not in from of =... chomp; my ( $ita, $spa, $num ) = split(/[=\s,]+/); # removes '=' or 's' or ',' & '+' to match 1 or more these characters $hash{$ita}[0] = $spa; #what about if there is no $num at position 1 in 1st file? if ( !defined $num ) { $hash{$ita}[1] = $num; # if defined then keep it for check later in position 2 in array } } close $in; while (<$in1>) { chomp; my ( $ita, $fren, $num1, $num2 ) = split(/[=\s,]+/); #creates col of numbers $hash{$ita}[1] = $fren; #now hashs format will look like this: ita=> spa fren #define if there is are numbers in position 3 and 4 concat to position 3 if ( defined($num1) and defined($num2) ) { $hash{$ita}[3] = $num1 . $num2; # concat if numbers defined in poition 1 and 2 and store in 3 } elsif ( defined $num1 ) { $hash{$ita}[3] = $num1; #if array has num in pos 2 then save number in position 3(dieci) } } close $in1; foreach my $ita ( keys %hash ) { if ( $hash{$ita}[0] and $hash{$ita}[1] ) { print $out "$ita =>", join( ',', @{ $hash{$ita} } ), "\n"; #line 54 } else { print $out1 "$ita =>", join( ',', @{ $hash{$ita} } ), "\n"; } } close $out; close $out1;