my ($foo, $bar) = @{shift(@_)}{qw/ -foo -bar /};
####
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
##
##
foobar({ -foo => 'FOO', -bar => 'BAR' });
sub foobar
{
my ($foo, $bar) = @{shift(@_)}{qw/ -foo -bar /};
print "\$foo => $foo, \$bar => $bar\n";
}