in reply to Grouping Objects by Attribute

Since there's a finite, sequential number of levels, you might as well just use nested arrays:
my (@monks); while (<DATA>) { chomp; split(/ /); push(@{$monks[$_[1]]}, $_[0]); } mysub($_) for @monks; sub mysub { print join(' ', sort(@$_)) . "\n"; } __DATA__ monk1 2 monk2 5 monk3 8 monk4 4 monk5 1 monk6 5 monk7 3 monk8 7 monk9 7
Or array / hash, if you need to be able to do more than just run through each set of monks:
my (@monks); while (<DATA>) { chomp; split(/ /); $monks[$_[1]]{$_[0]} = (); } mysub($_) for @monks; sub mysub { print join(' ', sort(keys %$_)) . "\n"; } __DATA__ monk1 2 monk2 5 monk3 8 monk4 4 monk5 1 monk6 5 monk7 3 monk8 7 monk9 7
A hash would enable you to quickly check for specific monks inside each set.