print join ', ', 1..$#F; # 1, 2, 3, 4, 5, 6, ...
print join ', ', 1..-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
注:这是一个不完整的例子,它不会正确地对一些边缘情况下工作
我明白了,那太糟糕了。我认为Perl维护者应该仍然把它作为一个特例来工作。 – Frank 2009-07-19 17:25:17
它不需要特殊情况,因为它已经非常简单:$ a [1 .. $#a]。在下标括号中,使事情以不同的方式工作是没有意义的。 – 2009-07-19 17:42:08