in reply to More efficient ways to pass values to a sub routine
You can avoid it, but it is clunky:
use 5.010; sub send_3{ my ($h) = @_; # 'fix' if broken parameters unless(ref($h) eq 'HASH'){ my %X = @_; $h = \%X; } # set default values $h->{foo} //='default'; # iterate over parameters for my $key (keys %$h){ say "$key ~> $h->{$key}" } } send_3( {"foo"=>42, "bar"=>'code'}); send_3( "baz"=>11, "zab"=>'dong');
Which yields:
fbrm@monastery:~/CODE/PERL/monks$ perl x foo ~> 42 bar ~> code zab ~> dong foo ~> default baz ~> 11
Note that starting from perl 5.10, you can use the "//=" operator to test if the variable is defined, and not just non-zero. (Imagine the call send_3(foo=>"0", bar=>"cool"), which using the above would yield "default cool", which might not be what you wanted. Using the //= operator it would yield "0 cool").
|
|---|