Thanks for all the help guys - really appreciate it. I wanted to be able to add more options (-x, -y, -z) easily, and to do it I ended up using an array of hashes - @arrAllArgs. When I enter:

perl myScript -i origSamples,moreSamples -p 1,3 -o 100,200

There is now a separate statement for parsing each argument:

parseNumericArgList($args{p}, 'pipeline', 1); parseNumericArgList($args{o}, 'overlap', 1);

And the subroutine (it's long winded but I can understand it):

sub parseNumericArgList { my ($arg, $tag, $deflt) = @_; my $sing = 0; my @new = (); if (defined($arg)) { # a list was entered if ($arg =~ /,/) { my @singles = split(",", $arg); foreach $sing (@singles) { if ($sing =~ /\D/) { print "\n\nWrong value in $tag\n\n"; die $USAGE } else { if (scalar(@arrAllArgs) == 0) { push (@new, addToRef($allArgs, $tag, $sing)); } else { foreach $allArgs (@arrAllArgs) { push (@new, addToRef($allArgs, $tag, $sing +)); } } } } } else { # a single value was entered if ($arg =~ /\D/) { print "\n\nWrong value in $tag\n\n"; die $USAGE } if (scalar(@arrAllArgs) == 0) { push (@new, addToRef($allArgs, $tag, $arg)); } else { foreach $allArgs (@arrAllArgs) { push (@new, addToRef($allArgs, $tag, $arg)); } } } } else { # nothing was entered, use default if (scalar(@arrAllArgs) == 0) { push (@new, addToRef($allArgs, $tag, $deflt)); } else { foreach $allArgs (@arrAllArgs) { push (@new, addToRef($allArgs, $tag, $deflt)); } } } @arrAllArgs = (); @arrAllArgs = @new; } sub addToRef { my ( $refIn, $addNm, $addVal ) = @_; my $ref = {}; my $k = ""; foreach $k (keys %{$refIn}) { $ref->{$k} = $refIn->{$k}; } $ref->{$addNm} = $addVal; return $ref; }
This provides me with the array of hashes @arrAllArgs
0 HASH(0x9e2930) 'overlap' => 100 'pipeline' => 1 1 HASH(0x9e55f0) 'overlap' => 200 'pipeline' => 1 2 HASH(0x9e2910) 'overlap' => 100 'pipeline' => 3 3 HASH(0xd8ead0) 'overlap' => 200 'pipeline' => 3
And then when I get to the main block of code it's a simple matter of

foreach $run (@arrAllArgs) { foreach $ak (keys %{$run}) { $runArgs{$ak} = $run->{$ak}; } processOne(); }
Have to add a bit to cope with non-numeric arguments and I'm there. Hope this helps anyone else in the same sitch....

In reply to Re: Storing multiple arguments in a data structure that allows for future expansion by appleb
in thread Storing multiple arguments in a data structure that allows for future expansion by appleb

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.