use warnings; use strict; my @total; $total[1][1] = 123; $total[2][1] = 345; $total[3][1] = 222; # hash of arrays: hash{ number } = [ i, j ] my %hash; for my $i ( 1 .. $#total ) { for my $j ( 1 .. $#{$total[$i]} ) { $hash{ $total[$i][$j] } = [ $i, $j ]; } } my @rank; my $ranking = 0; foreach my $value ( sort keys %hash ){ my ( $i, $j ) = @{$hash{ $value }}; $rank[$i][$j] = ++$ranking; } for my $i ( 1 .. $#rank ) { for my $j ( 1 .. $#{$rank[$i]} ) { print "rank[$i][$j] is $rank[$i][$j]\n"; } } #### rank[1][1] is 1 rank[2][1] is 3 rank[3][1] is 2 #### use warnings; use strict; my @total; $total[1][1] = 123; $total[2][1] = 345; $total[3][1] = 222; $total[4][1] = 222; # hash of arrays: hash{ number } = [ i, j ] my %hash; for my $i ( 1 .. $#total ) { for my $j ( 1 .. $#{$total[$i]} ) { push @{$hash{ $total[$i][$j] }}, $i, $j; } } my @rank; my $ranking = 0; foreach my $value ( sort keys %hash ){ ++$ranking; while ( my ($i, $j ) = splice @{$hash{ $value }}, 0, 2 ){ $rank[$i][$j] = $ranking; } } for my $i ( 1 .. $#rank ) { for my $j ( 1 .. $#{$rank[$i]} ) { print "rank[$i][$j] is $rank[$i][$j]\n"; } } #### rank[1][1] is 1 rank[2][1] is 3 rank[3][1] is 2 rank[4][1] is 2