views:

70

answers:

2

How can I use Getopt::Long method if the input command execution is like this:

$ testcmd -option check  ARG1 ARG2 ARG3

or

$ testcmd  ARG1 ARG2 ARG3
+1  A: 

A quick example:

#! /usr/bin/perl

use warnings;
use strict;

use Getopt::Long;

sub usage { "Usage: $0 [--option=VALUE] ARG1 ARG2 ARG3\n" }

my $option = "default";

GetOptions("option=s", \$option)
  or die usage;

die usage unless @ARGV == 3;

print "$0: option=$option: @ARGV\n";

Getopt::Long is quite flexible in what it will accept:

$ ./cmd
Usage: ./cmd [--option=VALUE] ARG1 ARG2 ARG3

$ ./cmd 1 2 3
./cmd: option=default: 1 2 3

$ ./cmd --option=foo 4 5 6
./cmd: option=foo: 4 5 6

$ ./cmd -option=bar 7 8 9
./cmd: option=bar: 7 8 9

$ ./cmd -option check a b c
./cmd: option=check: a b c
Greg Bacon
+3  A: 

You need to enable the pass_through option. Documentation quoted below:

pass_through (default: disabled)

Options that are unknown, ambiguous or supplied with an invalid option value are passed through in @ARGV instead of being flagged as errors. This makes it possible to write wrapper scripts that process only part of the user supplied command line arguments, and pass the remaining options to some other program.

If require_order is enabled, options processing will terminate at the first unrecognized option, or non-option, whichever comes first. However, if permute is enabled instead, results can become confusing.

DVK's posted an example of how to do this in another answer. I'd upvote his answer first if you find it useful.

Zaid
@Zaid - +1 for recognizing that values starting with "-" need to be passed through
DVK