in reply to question about getopt

As far as I understand, all options are optional by default. You can check if they are provided by simply looking if $source_file etc. is undef, and if yes, you can supply your own default value - or die if they are mandatory.

Replies are listed 'Best First'.
Re^2: question about getopt
by Sun751 (Beadle) on Jun 24, 2009 at 07:33 UTC
    is the general standard way of doing "option" in script,
    use strict; use warnings; use Getopt::Std; my %options; if (scalar @ARGV < 3) {usage()}; sub usage { print STDERR << "EOF"; \nThis program does... usage: $0 [-hcfo] -h : this (help) message -c : config file -o : Fj xcf release file -x : output file EOF exit; } getopts ("hc:f:o:", \%options); usage() if $options{h}; if ($options{o}) { $source_file = $options{o}; } else { $source_file = "as.xcf-dist"; } if ($options{c}) { $config_file = $options{c}; } else { $config_file = 'config.ini'; } if ($options{x}) { $dest_file = $options{x}; } else { usage(); }
    if you have any suggestion, Please let me know, Cheers
      You can always write that more tidily:
      my $source_file = $options{o} || 'as.xcf-dist'; my $config_file = $options{c} || 'config.ini'; my $dest_file = $options{x} || usage();

      Another possibility is to use Getopt::Long, which IMHO has a nicer API.

        Not just IYHO...
        Tk::Getopt uses the Getopt::Long API and makes it easy to knock up a simple GUI with loading/saving of options and setting defaults too... You can also override the gui part if you want to take options directly from the commandline

        Just a something something...
      I have several suggestions.

      You should probably change 'f' to 'x' in your usage and in your call to getopts. It looks like you have a bug.

      You should probably get rid of the @ARGV check because I doubt it does what you think it does. If you pass these 2 options on your command line, '-c foo -x bar', scalar @ARGV will resolve to 4, not 2, as you might expect. Instead, consider checking the return status of the getopts.

      I make it a habit to check if an option is defined, just in case '0' is a legal value:

      if (defined $options{o})

      Consider using the Core module Pod::Usage instead of rolling your own usage handler. I second the recommendation to switch to Getopt::Long.