Perhaps the following will assist you:
use Modern::Perl; use File::Slurp qw/read_file/; my ( $hash1, $hash2 ) = @ARGV or die $!; my %hash1 = map { /(.+?),(.+)/; $1 => $2 } grep /.,./, read_file $hash +1; my %hash2 = map { /(.+?),(.+)/; $1 => $2 } grep /.,./, read_file $hash +2; for my $key2 ( sort keys %hash2 ) { for my $key1 ( sort keys %hash1 ) { say "$key2\t$hash2{$key2}\t$key1" if $hash1{$key1} =~ /\b$hash +2{$key2}\b/; } }
Output:
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
A regex is used within map to initialize the hashes with key/value pairs. The grep /.,./ helps insure that the regex can match--in case there are any blank lines (or other non-matching lines) in the files. Instead of splitting %hash1's values on commas, a word-boundary match is used to see if a value in %hash2 exists as a value in %hash1, and both keys are printed if so.
Hope this helps!
Update: Output modified based upon OP's reply to tobyink.
In reply to Re: how to loop through hash tables more efficiently
by Kenosis
in thread updated_again: how to loop through hash tables more efficiently
by lrl1997
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |