use strict; use diagnostics; use warnings; use autodie qw(open close); use Data::Dumper; use 5.010; #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,]+/); say "values are $ita $spa $num"; $hash{$ita}[0] = $spa; #what about if there is no $num at position 1 in 1st file? if ( defined $num ) { $hash{$ita}[2] = $num; } } close $in; while (<$in1>) { chomp; my ( $ita, $fren, $num1, $num2 ) = split(/[=\s,]+/); say "values are $ita $fren $num1 $num2"; $hash{$ita}[1] = $fren; #now hash's format will look like this: ita=> spa fren #define if there are numbers in position 3 and 4 concat to position 3 if ( defined($num1) and defined($num2) ) { $hash{$ita}[3] = "$num1 $num2"; } elsif ( defined $num1 ) { $hash{$ita}[3] = $num1; } } close $in1; foreach my $ita ( keys %hash ) { if ( $hash{$ita}[0] and $hash{$ita}[1] ) { print $out "$ita =>", join( ',', @{ $hash{$ita} } ), "\n"; } else { print $out1 "$ita =>", join( ',', @{ $hash{$ita} } ), "\n"; } } print Dumper(\%hash); close $out; close $out1;