#  Chapter 3Functions ### 3.2.154 splice

```splice `ARRAY`, `OFFSET`, `LENGTH`, `LIST`
splice `ARRAY`, `OFFSET`, `LENGTH`
splice `ARRAY`, `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 MethodSplice 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.