splice ARRAY, OFFSET, LENGTH, LIST
splice ARRAY, OFFSET, LENGTH
splice ARRAY, OFFSET
splice ARRAY

从数组中移除由 OFFSET 和 LENGTH 指定的元素,并用 LIST 中的元素(如果有)替换它们。在列表上下文中,返回从数组中移除的元素。在标量上下文中,返回最后一个移除的元素,如果没有移除元素则返回 undef。数组会根据需要增长或缩小。如果 OFFSET 为负数,则它从数组末尾开始计算。如果省略 LENGTH,则从 OFFSET 开始移除所有元素。如果 LENGTH 为负数,则从 OFFSET 开始移除元素,除了数组末尾的 -LENGTH 个元素。如果 OFFSET 和 LENGTH 都省略,则移除所有元素。如果 OFFSET 超出数组末尾并且提供了 LENGTH,Perl 会发出警告,并在数组末尾进行拼接。

以下等价关系成立(假设 $#a >= $i

push(@a,$x,$y)      splice(@a,@a,0,$x,$y)
pop(@a)             splice(@a,-1)
shift(@a)           splice(@a,0,1)
unshift(@a,$x,$y)   splice(@a,0,0,$x,$y)
$a[$i] = $y         splice(@a,$i,1,$y)

splice 可以用于实现 n 叉队列处理,例如

sub nary_print {
  my $n = shift;
  while (my @next_n = splice @_, 0, $n) {
    say join q{ -- }, @next_n;
  }
}

nary_print(3, qw(a b c d e f g h));
# prints:
#   a -- b -- c
#   d -- e -- f
#   g -- h

从 Perl 5.14 开始,一个实验性功能允许 splice 接受一个标量表达式。这个实验被认为是不成功的,并在 Perl 5.24 中被移除。