Originariamente inviato da Claudio Vituzzi
ancora meglio...

codice:
# Ordino...
my @SORTED_ARRAY = sort { $HASH{$b} <=> $HASH{$a} } keys %HASH;
undef %HASH; # Libero la memoria...

## ho capito... ti bastano gli indici dell'hash

# Divido in pagine da $rows...
# $Current_page è il valore della pagina corrente ed arriva tramite cgi->param();

my $rows = 10;
if (!$Current_page) {$Current_page = 1};
my $end = (($Current_page * $rows)-1);
my $start   = (($Current_page * $rows)-$rows);
my $total_page = int( scalar(@SORTED_ARRAY) / $rows );
$total_page++ if ( scalar(@SORTED_ARRAY) % $rows != 0); # ? mi sipeghi meglio?

## ammettiamo che hai 34 record, se fai solo:
## my $total_page = int( scalar(@SORTED_ARRAY) / $rows );
## avrai un numero di pagine di 3, che è sbagliato
## perchè in realtà le pagine sono 4, 3 con 10 record ed 1
## con 4
## per ottenere il risultato giusto incrementi di uno il totale
## se il numero di record non è un multiplo esatto di 10

my $page_prev = $Current_page - 1;
if ($Current_page <= 1) { undef $page_prev };
## questa è una esagerazione... sprechi più risorse a 
##fare undef che lasciare fino alla fine dell'esecuzione 
## dello script la variabile
my $page_next = $Current_page + 1;
if ($Current_page =>  $total_page) { undef $page_next };
## vedi sopra e inoltre c'è un errore di sintassi
## si scrive >= e non =>
my @DIECI_IDS;
@DIECI_IDS = @SORTED_ARRAY[$start .. $end];
undef @SORTED_ARRAY; # Libero la memoria...

...

print @DIECI_IDS;

if ($page_prev) { ... ".cgi?Current_page="."$page_prev" } else { ... # non mostrare la freccia "prev" };
if ($page_next) { ... ".cgi?Current_page="."$page_next" } else { ... # non mostrare la freccia "next" };