If you have named-parameters (or would prefer to) you might benefit enormously from using either GetOpt::Std or GetOpt::Long
I've never been a huge fan of using $ARGV or $#ARGV+1 for the size as AnonyMonk suggested. In my (originally C-trained) eyes it is clearer to write: scalar(@ARGV). I have no reason to suggest it is better in terms of performance, just in terms of code clarity