use strict; use warnings; use PadWalker 'peek_sub'; use List::Util 'first'; ## Map named arguments to variables of those names. sub getargs { my %args = do { package DB; () = caller 1; @DB::args }; my $vals = peek_sub \&{(caller 1)[3]}; my %res = map { $_ => $args{substr($_, 1)} } grep exists $args{substr($_, 1)}, keys %$vals; my %map = map { my $orig_arg = \$_; my($ref_name) = first { $orig_arg == $vals->{$_} } keys %$vals; $ref_name => $orig_arg; } @_; ${ $map{$_} } = $res{$_} for keys %res; return \%res; } ## Basic test of getargs(); sub foo { getargs my($this, $that, $theother); print "this is: $this\nthat is: $that\nand the other is: $theother\n"; } ## Have these pairs mapped to variables of the same name. foo this => "an argument", that => "used to refer to things", theother => "is something else altogether";