> -----Original Message-----
> From: [email protected] [mailto:perl-
> [email protected]] On Behalf Of p sena
> Sent: 02 March 2011 17:16
> To: [email protected]
> Subject: regex like option *values*
>
> Hi,
>
> I want to use option and values like:-
>
> --option_name abc0[1-9].ctr.{pad,spd}.set.in
>
> or --option_name abc[01-22].ctr.{pad,spd}.set.in
>
> or --option_name abcL{1,2,3}.ctr.{pad,spd}.set.in
>
> or --option_name abcL[1,2,3].ctr.{pad,spd}.set.in
>
> or --option_name abcL{1,2,3}.ctr.{70,001}.set.in
>
> etc possibilities. This should in fact expand those option values into
> the right number of values/quantities i,e; --option_name will hold
> multiple values. Instead of supplying values one after another I just
> want to club them in a regex like style. I am already using Getopt::Long.
>
> What could be best way to handle this type of passing option values?
> Is there any existing module for this ?
I could be wrong, but I doubt that an existing module would do what you want.
Generating all possible strings that match a regex is hard in the general case,
if not impossible.
However, if you limit the expressions you want to expand and simplify your
syntax a bit, it's not too difficult. Here's a quick hack that, I think, does
pretty much what you want.
---------------------------------------------------
use strict;
use warnings;
while (<DATA>) {
chomp;
print "Expanding: $_\n";
my @result = expand_string($_);
print " $_\n" for @result;
}
# Expand string to array of strings based on lists & ranges in square
# brackets. Note recursion not strictly necessary, but it simplifies
# the code.
sub expand_string {
my $str = shift;
my @result;
if ($str =~ /^(.*?)\[([^]]+)\](.*)$/) {
my ($pre, $post) = ($1, $3);
my @bits = expand_list($2);
foreach my $bit (@bits) {
push @result, expand_string("$pre$bit$post");
}
}
else {
push @result, $str;
}
return @result;
}
# Return array from comma separated list of strings and ranges.
sub expand_list {
my @vals = split /\s*,\s*/, $_[0];
my @result;
foreach my $v (@vals) {
if ($v =~ /^([^-]+)-([^-]+)$/) {
push @result, eval "'$1'..'$2'";
die $@ if $@;
}
else {
push @result, $v;
}
}
return @result;
}
__DATA__
abc0[1-9].ctr.[pad,spd].set.in
abc[01-22].ctr.[pad,spd].set.in
abcL[1,2,3].ctr.[pad,spd].set.in
abcL[1,2,3].ctr.[pad,spd].set.in
abcL[1,2,3].ctr.[70,001].set.in
---------------------------------------------------
It should work for lists of ranges, and ranges of strings as well as numbers.
Regarding incorporating into Getopt::Long, see the Tips and Tricks section of
the doco.
HTH
--
Brian Raven
Please consider the environment before printing this e-mail.
This e-mail may contain confidential and/or privileged information. If you are
not the intended recipient or have received this e-mail in error, please advise
the sender immediately by reply e-mail and delete this message and any
attachments without retaining a copy.
Any unauthorised copying, disclosure or distribution of the material in this
e-mail is strictly forbidden.
_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs