Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

Handling Parameters

by xorl (Deacon)
on Jan 07, 2009 at 16:07 UTC ( #734656=perlquestion: print w/replies, xml ) Need Help??

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

I've seen lots of scripts where you can invoke them with flags followed by parameters (hopefully that's the right terminology)like this:
./myscript.pl -a param_a -b param_b -d param_d -c param_c input1 input +2

The problem is I don't know how to take that input and use it in the script. I know how to use @ARGV, but that would mean no flags and the params would have to be in the correct and same order every time.

The only solution I can think of right now is to loop through @ARGV.
Check if the value starts with a "-"
if it does then figure out which flag it is and assign the correct variable with the next value in @ARGV
if the value doesn't start with a "-" and the previous value doesn't either, then take that as normal input and proceed with the script.
if the value doesn't start with a "-" but the previous value does, then treat it as the value for that flag

Something about this just says to me there has to be a better way. Is there?

Thanks in advance

Edit: Big thanks to borisz for the first, most concise, and most useful answer. Thanks to everyone else as well.

Replies are listed 'Best First'.
Re: Handling Parameters
by borisz (Canon) on Jan 07, 2009 at 16:16 UTC
Re: Handling Parameters
by zentara (Archbishop) on Jan 07, 2009 at 16:15 UTC
Re: Handling Parameters
by properly (Monk) on Jan 07, 2009 at 16:17 UTC
    Getopt::Long
Re: Handling Parameters
by jethro (Monsignor) on Jan 07, 2009 at 17:07 UTC

    The right answer is naturally to use one of the Getopt modules as the previous posters said. If you want to know a better way in detail, your algorithm is a good starting point, just change it slightly:

    loop through @ARGV.
    Check if the value starts with a "-"
    if it does then figure out which flag it is and assign the correct variable with the next value in @ARGV. Step over both values
    if the value doesn't start with a "-" and the previous value doesn't either, then take that as normal input and proceed with the script.
    if the value doesn't start with a "-" but the previous value does, then treat it as the value for that flag

    Instead of looping over the values you can shift them off the array, which makes the variable stepping much easier

      Given the effort that's embodied in the Getopt modules, I'd really recommend using them unless you have some obscure requirement that they just can't meet. Re-inventing this wheel (a "better way"?) is well worth avoiding.

      Still interesting from an academic perspective. Would anyone care to comment on how the Getopt modules are implemented?

      --
      use JAPH;
      print JAPH::asString();

        "better way" than xorl's algorithm not "better way" than Getopt.

        Getopt::Std uses the algorithm I described, with shift.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2021-10-19 13:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My first memorable Perl project was:







    Results (76 votes). Check out past polls.

    Notices?