print join ', ', 1..$#F; # 1, 2, 3, 4, 5, 6, ...
print join ', ', 1..-1; #
この理由は、' ..
'演算子が配列添字内で特別なことを何もしないためです。
リスト コンテキストでは、左の値から右の値まで (1 ずつ) カウントする値のリストを返します。左の値が右の値より大きい場合、空のリストを返します。
$#F
は最後の要素のインデックスで、長さから ' ' を引いたものと同じ@F -1
です。( 長さが 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
注: これは不完全な例です。一部のエッジ ケースでは正しく機能しません。