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>


Reply via email to