如何在Perl 6中切断数组或数组引用?
在Perl 5中,我可以这样做:
my $d = [0 .. 9];
$#$d = 4;
在Perl 6中,如果我尝试这个,我会收到错误:
my $d = [0 .. 9];
$d.end = 4; # Cannot modify an immutable Int
这样可行,但它看起来不如Perl 5那么漂亮,可能很昂贵:
$d.=splice(0, 5);
答案 0 :(得分:13)
有一种简单的方法:
my $d = [0..9];
$d[5..*] :delete;
如果数组是无限数组,则会出现问题。
$d.splice(5)
也有同样的问题。
在平均情况下,您最好的选择可能是$d = [ $d[^5] ]
,您可能对阵列一无所知,并且需要一个可变阵列。
如果你不需要它是可变的$d = $d[^5]
,那么返回一个List可能会更好。
答案 1 :(得分:6)
splice
可能是这里的最佳选择,但您也可以使用^N
范围构造函数快捷方式缩短为五个元素(我称之为“直至”“运算符”但我相信是一个更正确的名称,因为它是Range
)的构造函数:
> my $d = [ 0 .. 9 ];
> $d.elems
> 10
> $d = [ $d[^5] ]
[0 1 2 3 4]
> $d.elems
5
> $d
[0 1 2 3 4]
“插入符号是......用于构造数值范围的前缀运算符 从零开始“。
(来自Range
documentation)
有人可以说perl6是“perl-ish”,因为它通常具有某种操作的显式版本(使用一种“可预测”的语法 - 方法,例程和:adverb
等如果您不熟悉该语言,那么这是可以理解的,然后是一个快捷方式。
我不确定哪种方法(splice
与捷径相比,使用:delete
正如布拉德吉尔伯特所提到的那样)在速度或内存使用方面具有优势。如果您运行:
perl6 --profile -e 'my $d = [ 0 .. 9 ]; $d=[ $d[^5] ]'
perl6 --profile -e 'my $d = [ 0 .. 9 ]; $d.=splice(0, 5);'
你可以看到一点点差异。如果与实际程序和工作负载进行比较,差异可能会更大。
答案 2 :(得分:2)
另一种选择是使用xx
运算符:
my $d = [0..9];
$d.pop xx 4; #-> (9 8 7 6)
say $d; #-> [0 1 2 3 4 5]
$d = [0..9];
$d.shift xx 5 #-> (0 1 2 3 4)
say $d; #-> [5 6 7 8 9)