My function is
use 5.028;
use strictures;
use Kavorka qw(fun);
fun foobar(:$foo, :$bar) { say $foo, $bar; }
I need to pass it named arguments, not positional arguments.
foobar('quux', 'quuuux');
# Unknown named parameter: quux at … line 5.
# main::foobar("quux", "quuuux") called at … line 7
but
foobar(foo => 'quux', bar => 'quuuux');
# ok
Hashes or HashRefs are accepted, too.
my %args = (foo => 'quux', bar => 'quuuux');
foobar(%args);
my $args = {foo => 'quux', bar => 'quuuux'};
foobar($args);
In ES6 exists a short-cut where variables in an object literal are expanded (ed: MDN link?):
function foobar({foo, bar}) { console.log(foo, bar); }
foobar({foo: 'quux', bar: 'quuuux'});
const foo = 'quux';
const bar = 'quuuux';
foobar({foo: foo, bar: bar});
foobar({foo, bar}); // NB!
In Perl 6 a : prefixed variable in a parameter signature will create a key of the same name:
use v6;
sub foobar(:$foo, :$bar) { say $foo, $bar; }
foobar(foo => 'quux', bar => 'quuuux');
my $foo = 'quux';
my $bar = 'quuuux';
foobar(foo => $foo, bar => $bar);
foobar(:$foo, :$bar); # NB!
How can you accomplish something comparable in effect for Perl 5?
my $foo = 'quux';
my $bar = 'quuuux';
foobar(???);