Hi waytoperl,
Considering, the __DATA__ and the hash data presented, there is no way you are getting this desired output
Pigeon.Lion.Tiger.Elephant SOME_DATA (Key1)
Pigeon.Lion.Tiger.Monkey SOME_DATA (Key3)
Why?
- If "Pigeon." and " SOME_DATA" is taken away from your input coming from __DATA__, compare with your hash data if "Cat.Mouse.Game." is taken away you practically have these:
- Lion.Tiger.Elephant
- Lion.Tiger.Lion
- Lion.Tiger.Monkey
-
With " SOME_DATA" common to all input, one cannot use it to differentiate, when comparing with the hash data given.
- And with the OP update given, all compared data will match, except if there is some kind of changed in input data. Then would the (key2) not match
Something like this:
use warnings;
use strict;
my %hash = (
'Key1' => 'Cat.Mouse.Game.Lion.Tiger.Elephant',
'Key2' => 'Cat.Mouse.Game.Lion.Tiger.Lion',
'Key3' => 'Cat.Mouse.Game.Lion.Tiger.Monkey',
);
while ( my $data = <DATA> ) {
chomp($data);
my $value = join '.' => ( split /[\s.]/, $data )[ 1 .. 3 ];
print map { "$data ($_)\n" if $hash{$_} =~ /$value/ } keys %hash;
}
__DATA__
Pigeon.Lion.Tiger.Elephant SOME_DATA
Pigeon.Lion.Tiger.SeaLion SOME_DATA
Pigeon.Lion.Tiger.Monkey SOME_DATA
OUTPUT
Pigeon.Lion.Tiger.Elephant SOME_DATA (Key1)
Pigeon.Lion.Tiger.Monkey SOME_DATA (Key3)
Please note that the input data has been changed from what the OP gave.
With the OP input, the output will be:
Pigeon.Lion.Tiger.Elephant SOME_DATA (Key1)
Pigeon.Lion.Tiger.Lion SOME_DATA (Key2)
Pigeon.Lion.Tiger.Monkey SOME_DATA (Key3)
If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author
unknown to me