my $pages = 25; my $curr_page = 13; my $page_size = 6; my ( $links, $curr_range) = pager("/cgi-bin/script.pl", $pages, $curr_page, $page_size); print "Current page array[$curr_page] display range $curr_range\n\n", $links; sub pager { my ( $link, $total, $curr_page, $page_size ) = @_; $link .= $link =~/\?/ ? "&" : '?'; $curr_page ||= 0; $page_size ||= 6; my @links; my $current_range = 'Unkown'; for ( my $start = 0; $start < $total; $start += $page_size ) { my $end = ($start+$page_size)>$total ? $total : $start+$page_size; my $range = $start+1 == $end ? $start+1 : sprintf "%d-%d", $start+1, $end; $end -=1; # we show 1-10 but this is 0-9 in array terms push @links, ($curr_page >= $start and $curr_page <= $end) ? "$range\n" : qq!$range\n!; $current_range = $range if ($curr_page >= $start and $curr_page <= $end); } return (join ' | ', @links) , $current_range; } __DATA__ Current page array[13] display range 13-18 1-6 | 7-12 | 13-18 | 19-24 | 25