Hi,
you might achieve concurrent use of named and positional args by doing the following:
If a single hash_ref is passed, then treat it as single hash_ref containing named arguments. Otherwise consider them to be positional.
For Example:
sub get_args {
if ((scalar(@_) == 1) && ref($_[0]) eq 'HASH') {
print "got named args!\n";
} else {
print "got positional args\n";
}
}
sub named_or_positional {
get_args(@_);
}
named_or_positional({foo => 'avalue' , bar => ['a', 'b']});
named_or_positional('whatever' , 'we', 'are', 'passing');
Only Limitation: you won't be able to use a single hash_ref as a positional argument (as it would be treated like an named arg). The Passing of named arguments as a hash ref is also recommended in "Perl Best Practices" by Damian Conway as it catches named arguments where the number of args is odd and not even(usually caused by some typo). This bears the advantage that you catch those typos at compile time and not at runtime.