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}; }