use strict ; use warnings ; use List::Util qw(max) ; open my $STUFF, "<", "stuff.csv" or die "$!" ; my %number_ids = () ; while (my $line = <$STUFF>) { $line =~ s/\s+\z// ; $line =~ s/\A\s+// ; my @csv = split(/\s*\,\s*/, $line) ; if (defined($csv[2]) && ($csv[2] =~ m/^\d+$/)) { $number_ids{$csv[2]}++ ; } elsif (defined($csv[4]) && ($csv[4] =~ m/^group\:/i)) { show_most_popular(\%number_ids) ; print $line, "\n" ; %number_ids = () ; } else { # OK, so what do we do with peculiar lines ? } ; } ; show_most_popular(\%number_ids) ; sub show_most_popular { my ($r_ids) = @_ ; return if !%$r_ids ; my $max = max(values %$r_ids) ; my @popular = () ; while (my ($id, $count) = each %$r_ids) { if ($count == $max) { push @popular, $id ; } ; } ; print join(',', sort @popular), "\n" ; } ;