It's really no different than a shift.
If I understand perlsub, the subtlety here is that @_ itself is not an alias to the original array/list of arguments -- rather, @_ is a local array with each element an alias to the corresponding element in the argument list -- which is why you can shift, pop or (as in this case) splice @_ at will.
However, assigning to @_ or even using splice to overwrite part of an array, destroys that aliasing for whatever is overwritten. Thus:
use strict; use warnings; sub splice_insert { splice( @_, 2, 2, ('a' .. 'c') ); print "@_ # after splice\n"; $_ = '.' for @_; print "@_ # after for loop\n"; } my @a = ( 0 .. 6 ); print "@a # before subroutine\n"; splice_insert(@a); print "@a # after subroutine\n";
Prints:
0 1 2 3 4 5 6 # before subroutine 0 1 a b c 4 5 6 # after splice . . . . . . . . # after for loop . . 2 3 . . . # after subroutine
-xdg
Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.
In reply to Re^6: Unobvious Pathological Code Snippets
by xdg
in thread Unobvious Pathological Code Snippets
by QM
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |