sub get_args { if (scalar(@_) == 1) { if (ref($_[0]) eq 'HASH') { return "got named args!\n"; } elsif (ref($_[0]) eq 'ARRAY') { return "got positional args\n"; } else { die "argument wasn't a hash or array reference!\n"; } } else { die "got more than one arg!\n"; } } sub named_or_positional { print get_args(@_); } named_or_positional({foo => 'avalue' , bar => ['a', 'b']}); named_or_positional(['whatever' , 'we', 'are', 'passing']); named_or_positional('whatever' , 'we', 'are', 'passing');