print join ', ', 1..$#F; # 1, 2, 3, 4, 5, 6, ...
print join ', ', 1..-1; #
Причина этого в том, что оператор '..
' не делает ничего особенного внутри индекса массива.
В контексте списка возвращает список значений, начиная с левого значения до правого значения. Если левое значение больше правого, возвращается пустой список.
<Ч />
$#F
- это индекс последнего элемента, который равен длине минус один '@F -1
'. (Если длина хотя бы одного.)
$F[-1]
- это особый случай, облегчающий доступ к элементам с другого конца, без необходимости расчета позиции вручную.
$F[-1] === $F[ @F -1 ] === $F[ $#F ]
@F[ 1 .. (@F -1) ] === @F[ 1 .. $#F ]
@F[ 1 .. (@F -2) ] === @F[ 1 .. ( $#F -1 ) ]
Зная это, вы можете использовать переменные в операторе диапазона:
use strict;
use warnings;
use feature 'say';
sub list{
my($arr,$first,$last) = @_;
$first = @$arr + $first if $first < 0;
$last = @$arr + $last if $last < 0;
return @$arr[ $first .. $last ];
}
my @F = 1..3;
say join ', ', list(\@F,1,-1)
2, 3
Примечание: это неполный пример, он не будет работать правильно для некоторых крайних случаев