in reply to howto map/grep a complex structure

The deeper underlying problem is that map / grep are well suited to process lists but not paired structures like hashes.

You could build your own map like operators for hashes if you really wanted. But nonstandard ops are not wildly readable.

You might try shortening your code with a while ( each ) and a grep or smartmatch ~~ if you want, but both structures are disputed.

update

depending on if you really need each submatch :

use Data::Dump; my $hash={}; for my $hk ( 4..10 ) { push @{$hash->{$hk}->{member}}, 1..$hk,1..$hk; } dd $hash; $\="\n"; my $pat="8"; print "Test1:"; while ( my ($hk,$hv) = each %$hash ) { print "$hk " x grep {$pat eq $_} @{$hv->{member}}; } print "Test2"; while ( my ($hk,$hv) = each %$hash ) { print "$hk" if $pat ~~ $hv->{member}; }

{ 4 => { member => [1 .. 4, 1 .. 4] }, 5 => { member => [1 .. 5, 1 .. 5] }, 6 => { member => [1 .. 6, 1 .. 6] }, 7 => { member => [1 .. 7, 1 .. 7] }, 8 => { member => [1 .. 8, 1 .. 8] }, 9 => { member => [1 .. 9, 1 .. 9] }, 10 => { member => [1 .. 10, 1 .. 10] }, } Test1: 8 8 10 10 9 9 Test2 8 10 9

Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Je suis Charlie!