my %monks_by_level; for my $monk ( @array_of_monks ) { my $level = $monk->level(); # or ->{level} or whatever... push @{ $monks_by_level{$level} }, $monk; } for my $level ( keys %monks_by_level ) { print "doing $level...\"; callToPrayer( $monks_by_level{$level} ); } sub callToPrayer { my ($monks) = @_; for my $monk ( @$monks ) { print "$monk->name() here!\n"; } }