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
注意:这是一个不完整的示例,它在某些极端情况下无法正常工作