my %group2user; foreach my $rec (@all_groups) { push @{$group2user{$rec->[0]}}, $rec; } foreach my $group_id (sort keys %group2user) { # Do whatever } #### my $old_id; for my $rec (@all_groups) { if (not defined $old_id or $old_id <=> $rec->[0]) { # Spit out header $old_id = $rec->[0]; } # Print user record }