my %vals; while (){ chomp; my ($key, $val) = split; push @{$vals{$key}}, $val; } for my $key (sort {$a <=> $b} keys %vals) { my $max = max @{$vals{$key}}; print "$key $max\n"; } I figured that , since my hint for a successful functioning of the code included parsing of excel using Spreadsheet::ParseExcel, I went ahead and added the code to the parsing one as such: #!/usr/bin/perl -w use strict; use warnings; use Spreadsheet::ParseExcel; use List::Util qw(max); my $parser = Spreadsheet::ParseExcel->new(); my $workbook = $parser->parse('4_19_10_Zrc01a-2.xls'); if ( !defined $workbook ) { die $parser->error(), ".\n"; } for my $worksheet ( $workbook->worksheets() ) { my ( $row_min, $row_max ) = $worksheet->row_range(); my ( $col_min, $col_max ) = $worksheet->col_range(); for my $row ( $row_min .. $row_max ) { for my $col ( $col_min .. $col_max ) { my $cell = $worksheet->get_cell( $row, $col ); next unless $cell; my %vals; while (<$col eq 5 and $col eq 8>){ chomp; my ($key, $val) = split; push @{$vals{$key}}, $val; } for my $key (sort {$a <=> $b} keys %vals) { my $max = max @{$vals{$key}}; print "$key $max\n"; } } } }