perlmeditation
Roger
Today someone asked about what the following code is doing:<br>
<code>
my ($foo, $bar) = @{shift(@_)}{qw/ -foo -bar /};
</code><br>
I thought it's a good idea to add the explanation to the above idiom to the tutorial. (Although [tye] probably thinks that this is a bad idiom. :-)<br><br>
What the above code is doing:<br>
<code>
shift(@_)
# get an element from the parameter list
qw/ -foo -bar /
# creates a list of two strings: "-foo" and "-bar"
@{ shift(@_) }{ qw/ -foo -bar / }
# dereference the anonymous hash reference as a hash slice
# returns a list containing the values of the given keys
# in the anonymous hash, in the form of:
#
# @values = @hash{@keys}
my ($foo, $bar) = @{ shift(@_) }{ qw/ -foo -bar / };
# assign the two element list retrieved into $foo and $bar
</code><br>
This technique can be used to retrieve named parameters in a subroutine. For example:<br>
<code>
foobar({ -foo => 'FOO', -bar => 'BAR' });
sub foobar
{
my ($foo, $bar) = @{shift(@_)}{qw/ -foo -bar /};
print "\$foo => $foo, \$bar => $bar\n";
}
</code><br>
Which I think is pretty handy.<br><br>