my @monks = ...; # Array of Monk objects, with a level method. my %monks_by_level; push(@{$monks_by_level {$_->level()}}, $_) for @monks; while (my ($level, $monks) = each(%monks_by_level)) { callToPrayer($monks) } #### foreach my $level (1 .. 10) { callToPrayer(grep($_->level() == $level, @monks)); }