Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

question about getopt

by Sun751 (Beadle)
on Jun 24, 2009 at 07:05 UTC ( [id://774270]=perlquestion: print w/replies, xml ) Need Help??

Sun751 has asked for the wisdom of the Perl Monks concerning the following question:

I am writing the script for "option" while getting arguments from command line, and below I have code,
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}; my $source_file= $options{o}; my $dest_file= $options{x}; my $config_file= $options{c};
And in above code, I want to "-o" to be optional for example if user don't provide "-o(filename)" that means value for $source_file then I want to take default file suppose "source.txt"; Could any one guide me how can that be done?Please. Cheers

Replies are listed 'Best First'.
Re: question about getopt
by moritz (Cardinal) on Jun 24, 2009 at 07:08 UTC
    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.
      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.

        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.

Re: question about getopt
by hifirock (Novice) on Jun 24, 2009 at 09:13 UTC
    Initialize the source_file with default value before invoking the getOptions function.
    my $source_file= "source.txt getopts ("hc:f:o:", \%options); usage() if $options{h}; $source_file= $options{o} if (defined($options{o});

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://774270]
Approved by targetsmart
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (6)
As of 2024-04-25 11:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found