in reply to Re^4: Unobvious Pathological Code Snippets
in thread Unobvious Pathological Code Snippets

See Juerd's original thread: Non-destructive array processing for some explanation/discussion.

How it works, as I understand, and anyone knows better, please correct me.

When you pass an array to a sub, each of the elements of @_ is alias to the elements of the original array. As the destructive manipulations are applied to @_ rather than the original array, the original array and it's contents remain untouched by the process.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
  • Comment on Re^5: Unobvious Pathological Code Snippets

Replies are listed 'Best First'.
Re^6: Unobvious Pathological Code Snippets
by xdg (Monsignor) on Mar 28, 2006 at 23:16 UTC

    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.