fix corner case where #items-1 == #pages
[perl/list-index.git] / lib / List / Index.pm
index 6309d2e0d3413926b6063098444e17f471f796f6..35f0549e288cd999cab4e5238cf6b8c142d7b17e 100644 (file)
@@ -24,9 +24,9 @@ sub ranges {
        my $pagesize = $options->{pagesize} || 50;
        my $context  = $options->{context } // 1 + ($pagesize >> 4);
        my $length   = $options->{length  } || 4;
-       my $pages    = $options->{pages   } || 1 + int $#rows / $pagesize;
+       my $pages    = $options->{pages   } || 1 + int($#rows / $pagesize);
 
-       $pagesize = $pages >= $#rows ? 1 : @rows / $pages;
+       $pagesize = $pages >= @rows ? 1 : @rows / $pages;
        my $shrunk = 0;
        my $enlarged = 0;
 
@@ -60,18 +60,21 @@ sub ranges {
                        if ((my $after = $offset + $lookahead) < $#rows) {
                                # see how much of it matches the current link
                                my $trim = 1;
+                               pos $link = 0;
                                for my $match (split //, $rows[$after]) {
                                        scalar $link =~ /\G\Q$match/g or last;
                                        $trim++;
                                }
                                # use this link if it's shorter
                                if ($trim < length $link) {
-                                       $link = substr $rows[$after], 0, $trim;
-                                       # advance lookbehind offset on the next page
                                        $enlarged = 0;
                                        for ($offset + 1 .. $after) {
+                                               my $prefix = substr $rows[$_], 0, $trim;
+                                               # advance lookbehind offset on the next page
                                                $shrunk++;
-                                               last if $rows[$_] =~ /^\Q$link/;
+                                               next if $link =~ /^\Q$prefix/;
+                                               $link = $prefix;
+                                               last;
                                        }
                                }
                        }