use Modern::Perl; use File::Slurp qw/read_file/; my ( $hash1, $hash2 ) = @ARGV or die $!; my %hash1 = map { /(.+?),(.+)/; $1 => $2 } grep /.,./, read_file $hash1; my %hash2 = map { /(.+?),(.+)/; $1 => $2 } grep /.,./, read_file $hash2; for my $key2 ( sort keys %hash2 ) { for my $key1 ( sort keys %hash1 ) { say "$key2\t$hash2{$key2}\t$key1" if $hash1{$key1} =~ /\b$hash2{$key2}\b/; } } #### k_b1 val_a1 k_a1 k_b2 val_a2 k_a1 k_b3 val_a3 k_a1 k_b4 val_a4 k_a2 k_b5 val_a5 k_a2