G'day brassbin,
If we knew what problem you were attempting to solve with this requirement, you'd probably get better answers.
If you moved the checking of 3 values (i.e. s{3}) from GetOptions() to sub1() and passed --test a string containing the values, you could do something like this:
$ perl -Mstrict -Mwarnings -le '
use Getopt::Long;
sub sub1 {
my ($name, $value) = @_;
my $want = 3;
my @got = split /\s+/ => $value;
die "--$name requires $want values. Got: @got\n" unless @got =
+= $want;
print "$name $_" for @got;
}
GetOptions( "test=s" => \&sub1 );
' -- --test 'a b c'
test a
test b
test c
And with the wrong number of values:
$ perl -Mstrict -Mwarnings -le '
...
' -- --test 'a b'
--test requires 3 values. Got: a b
$ perl -Mstrict -Mwarnings -le '
...
' -- --test 'a b c d'
--test requires 3 values. Got: a b c d
Additional Information Update:
You wrote "as if the sub was called 3 times". It's not "as if", that's exactly what's happening.
This shows each separate call with the individual arguments highlighted:
$ perl -Mstrict -Mwarnings -E '
use Getopt::Long;
sub sub1 { state $i = 0; ++$i; say "$i: >>>$_<<<" for @_ }
GetOptions( "test=s{3}" => \&sub1 );
' -- --test a b c
1: >>>test<<<
1: >>>a<<<
2: >>>test<<<
2: >>>b<<<
3: >>>test<<<
3: >>>c<<<
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.