my %lookup = map { my $grp = $_; map { $_ => $grp } ( @{ $groups{$grp} }; } (keys %groups); # ... and then below ... foreach my $name (@usernames) { $output{$time}{ $lookup{$name} }++; # ... or, if you have users logged in that aren't in a group # $output{$time}{ $lookup{$name} }++ if exists $lookup{$name}; # ... or, to track those users with no groups # $output{$time}{ $lookup{$name} || 'unknown' }++; } #### my %lookup = (); foreach my $grp (keys %groups) { push @{$lookup{$_}}, $grp foreach @{$groups{$grp}}; } ... foreach my $name (@usernames) { $output($time){$_}++ foreach @{$lookup{$name}}; }