or this for positional parameters: validate_pos( @_, { type => SCALAR }, { type => ARRAYREF, optional => 1 } ); By default, parameters are assumed to be mandatory unless specified as optional. #### #!/usr/bin/perl #use strict; use warnings; use Params::Validate; sub func1 { validate_pos( @_, { type => SCALAR} ); print "hi fluffy\n"; } func1("test"); #### Argument "SCALAR" isn't numeric in subroutine entry at ./a.pl line 8. Parameter #1 ("test") to main::func1 was a 'scalar', which is not one of the allowed types: at ./a.pl line 8 main::func1(3) called at ./a.pl line 13