Here's my solution, probably a little more complex than Marshall's above.
It does two passes over the hash. In the first pass, it builds a HoA where the keys are the all the words from 'yourStr' and the values are arrays holding the IDs concerned, which ends up looking like this:
good => [ 'ID3' ], hello => [ 'ID1', 'ID3', 'ID2' ], goodbye => [ 'ID1' ], where => [ 'ID1' ]
On the second pass, it checks if the value of 'myStr' is in the HoA, and prints out any matches, excluding 'internal' matches (ie if for the same ID 'hello' were to appear in both 'myStr' and 'yourStr').
use strict; use warnings; my $h = { ID1 => { myStr => 'hello', description => 'Description 1', yourStr => [ 'goodbye', 'where', 'hello'] }, ID2 => { myStr => 'good', description => 'Description 2', yourStr => [ 'hello', ] }, ID3 => { myStr => 'testvar', description => 'Description 2', yourStr => [ 'hello', 'good' ] }, }; my %yourstr; for my $id ( keys %$h ) { for ( @{ $h->{$id}->{yourStr} } ) { push @{ $yourstr{$_} }, $id; } } for my $id ( keys %$h ) { my $mystr = $h->{$id}->{myStr}; if ( $yourstr{$mystr} ) { my @matches = grep { $_ ne $id } @{ $yourstr{$mystr} }; print "'$mystr' in $id matches @matches\n"; } }
Output:
'hello' in ID1 matches ID3 ID2 'good' in 1D2 matches ID3
In reply to Re: Comparing values in same hash?
by Not_a_Number
in thread Comparing values in same hash?
by legendx
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |