use Getopt::Long; for ( '--server api.blr-ocp1.lab.rbbn.com --username mgore --password abc123', '--server api.blr-ocp1.lab.rbbn.com --token kfjshdssahdvkbvjkbj', ) { local @ARGV = split; my( $server, $username, $password, $token ); GetOptions( 'server=s' => \$server, 'username=s' => \$username, 'password=s' => \$password, 'token=s' => \$token, ) or die; $server or die "--server is required\n"; $token && ($username || $password) and die "cannot provide --username or --password with --token\n"; ($username xor $password) and die "--username and --password must be provided together\n"; $token || $username or die "must provide either --token or --username plus --password.\n"; if ($token) { } else # username+password { } }