http://qs321.pair.com?node_id=333293


in reply to Perl Idioms Explained - my ($foo, $bar) = @{shift(@_)}{qw/ -foo -bar /}

interestingly enough, I used something (partly, at least) similar in a recent post of mine.

in my endless quest for Evil Things To Do, I was looking for a way to express this:

sub deref { my $ref = shift; return $$ref; }
in a more succint way. the first thing, of course, was to get rid of $ref, and so I wrote:
sub deref { ${$_[0]} }
but this is nothing sexy. so I thought, maybe I can get rid of $ref while still retaining the shift:
sub deref { ${shift} }
but this doesn't work, and it took me a bit (and the help of B::Deparse) to understand why.

${shift} is interpreted by the parser as a way to write $shift, and of course it returns nothing.

so I realized that the Perl parser needs to be hinted to get shift as a keyword, and this can be done in (at least :-) 3 ways:

sub deref { ${shift@_} } # too much explicit sub deref { ${+shift} } # supersticious? cfr. Roger sub deref { ${shift;} }
the last one I find particularly surprising :-)

cheers,
Aldo

King of Laziness, Wizard of Impatience, Lord of Hubris