У меня есть несколько способов сделать это, используя либо PadWalker (спасибо за моб за предложение), либо Hash Slices:
use strict;
use warnings;
use Data::Dumper;
use PadWalker qw/ var_name /;
sub test_sub { print Dumper [ @_ ] }
my %vars;
$vars{foo} = "foo_data";
$vars{bar} = "var_data";
test_sub( %{vars}{qw/ foo bar/} );
# nv = named variables ( rename as needed )
sub nv { map { ( substr( var_name(1, \$_), 1) => $_ ) } @_ }
my $foo = 'foo_stuff';
my $bar = 'bar_stuff';
test_sub( nv( $foo, $bar ) );
, что дает:
$VAR1 = [
'foo',
'foo_data',
'bar',
'var_data'
];
$VAR1 = [
'foo',
'foo_stuff',
'bar',
'bar_stuff'
];
Пришлосьсделайте субстрат в nv, иначе он показывает сигил, но это лучшее, что я могу придумать, не вдаваясь в более глубокую магию.
Без использования nv это потребует более глубокой магической манипуляции ...
Использование вашего кода Kavorka:
use 5.020;
use strictures;
use Kavorka qw(fun);
use PadWalker qw/ var_name /;
fun foobar(:$foo, :$bar) { say $foo, $bar; }
my %vars;
$vars{foo} = "foo_data";
$vars{bar} = "var_data";
foobar( %{vars}{qw/ foo bar/} );
# nv = named variables ( rename as needed )
sub nv { map { ( substr( var_name(1, \$_), 1) => $_ ) } @_ }
my $foo = 'foo_stuff';
my $bar = 'bar_stuff';
foobar( nv( $foo, $bar ) );
дает:
foo_datavar_data
foo_stuffbar_stuff
У меня не установлено 5.28 локально, к сожалению, хе