[Chapter 3] 3.2.154 splice
Author: Larry Wall, Tom Christiansen & Randal L. Schwartz
Date: 1999-07-02T01:54:26Z

#

| Chapter 3 Functions |

### 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 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.

3.2.153 sort |  | 3.2.155 split