Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Named arguments in Perl5. Sorta.

by broquaint (Abbot)
on Oct 04, 2005 at 16:11 UTC ( #497312=snippet: print w/replies, xml ) Need Help??
Description: Given a list of pairs the variable names matching the keys will automagically be assigned to the corresponding values.

I'd had it in the back of my mind that this could be achieved fairly simply, as demonstrated below, but as you can see it's not the most robust of methods. I'll CPAN-ify it if anyone wants a rather more sensible version of the code, and I'm sure documentation and tests wouldn't go amiss too.

Update: This code can now be found on CPAN going under the guise of Params::Named.

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";
Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: snippet [id://497312]
help
Chatterbox?
[Corion]: But if the base intention was to have CIG as "co-developers" who (have to) contribute changes back to the mainline, it makes sense to have them use no other engine
[marto]: yes, I hear that development house has been on its last legs for a couple of years now
[Corion]: Is anybody aware of what makes Android Oreo better than Android Nougat? I'm not sure if the architectural changes (etc) are there already that make upgrading an Oreo-kernel phone to a newer Android userland (Lineage OS) version feasible
[Corion]: Yeah, CryTek got blindsided (or whatever) by Unity and Unreal Engine being zero cost, and the CryTek documentation being bad/nonexistent I think
[Corion]: "zero monetary cost", because of course, it's gratis only if your time has no value :)
[marto]: I used to keep up to date with my android ROMs, updating to the nightly every other day
[marto]: in my experience the jump in major releases has been painless, and performed better

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (6)
As of 2017-12-14 10:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What programming language do you hate the most?




















    Results (389 votes). Check out past polls.

    Notices?