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