spliceARRAY
,OFFSET
,LENGTH
,LIST
spliceARRAY
,OFFSET
,LENGTH
spliceARRAY
,OFFSET
This function removes the elements designated by
OFFSET
and
LENGTH
from an array, and replaces them with the elements of
LIST
, if any. The function returns the elements removed from the array. The array grows or shrinks as necessary. If
LENGTH
is omitted, the function removes everything from
OFFSET
onward. The following equivalences hold (assuming
$[
is 0):
Direct Method | Splice Equivalent |
---|---|
push(@a, $x, $y)
|
splice(@a, $#a+1, 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[$x] = $y
|
splice(@a, $x, 1, $y);
|
The splice function is also handy for carving up the argument list passed to a subroutine. For example, assuming list lengths are passed before lists:
sub list_eq { # compare two list values my @a = splice(@_, 0, shift); my @b = splice(@_, 0, shift); return 0 unless @a == @b; # same len? while (@a) { return 0 if pop(@a) ne pop(@b); } return 1; } if (list_eq($len, @foo[1..$len], scalar(@bar), @bar)) { ... }
It would probably be cleaner just to use references for this, however.