On 07/13/2006 12:47 AM, Dr.Ruud wrote:
"Mumia W." schreef:
Ryan Moszynski:
I need to write some code to allow users to specify which of a whole
bunch of elements(e.g.512/1024) that they want to view. My idea for
how to do this was to have them input a semicolon delimited list, for
example:
1-10;25;33;100-250
i tried using this to check to make sure they input a valid list that
i can process:
[...]
$str =~ m/^((\d+-\d+|\d+);?)+$/g;
However, this does not consider 250-100 to be invalid.
Nor "10-30-20".
[...]
I really wanted to do this without resorting to map and
grep, so I did it every which way I could think of
using s/// and m//. Watch out for wrapping.
our ($datastr, @F);
my @data = \('1-10;25;33;100-250', '1-10;25;33;x100-250',
'1-10;25;33;100-250-90', '1-10;25;33-9-18;100-250',
'1-10;25;33-18;100-250');
my @checkranges;
push @checkranges, sub {
# F1: Okay
my $str = shift;
$str =~ s/(\d+-\d+|\d+);?//g;
'' eq $str;
};
push @checkranges, sub {
# F2: Buggy
my $str = shift;
$str =~ m/^((\d+-\d+|\d+);?)+$/g;
};
push @checkranges, sub {
# F3: Okay
my $str = shift;
$str =~ m/^((\d+-\d+|\d+)(;|$))+$/g;
};
push @checkranges, sub {
# F4: Okay, the best; it checks ranges.
my $str = shift;
$str =~ s/(?:(\d+)-(\d+)|(\d+));?/
$3 ? '' : ($2 > $1 ? '' : 'y')
/eg;
'' eq $str;
};
my $truefalse = sub {
shift() ? 'true' : 'false';
};
$~ = 'FUNFORMAT';
$datastr = \'STRING';
@F = qw(FUNC-1 FUNC-2 FUNC-3 FUNC-4);
write;
for $datastr (@data) {
@F = ();
push @F, $truefalse->($_->($$datastr)) for
(@checkranges);
write;
}
format FUNFORMAT =
@<<<<<<<<<<<<<<<<<<<<< @<<<<<<<< @<<<<<<<< @<<<<<<<< @<<<<<<<
$$datastr, $F[0], $F[1], $F[2], $F[3]
.
__END__
Output:
STRING FUNC-1 FUNC-2 FUNC-3 FUNC-4
1-10;25;33;100-250 true true true true
1-10;25;33;x100-250 false false false false
1-10;25;33;100-250-90 false true false false
1-10;25;33-9-18;100-25 false false false false
1-10;25;33-18;100-250 true true true false
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>