"Mumia W." schreef: > Dr.Ruud: >> Mumia W.: >>> $str =~ m/^((\d+-\d+|\d+);?)+$/g; >>> >>> However, this does not consider 250-100 to be invalid. >> >> Nor "10-30-20". >> >> What's the g-modifier for? >> >> The structure is 'a;b;c;d', the smallest is 'a', so treat the ';' as >> the start of a trailer. > > Oh yes, I see that the /g was superfluous, but I don't > understand about the 'trailer' part.
rangelist = range *( ";" range ) range = number [ "-" number ] number = 1*DIGIT (see http://en.wikipedia.org/wiki/Augmented_Backus-Naur_form ) The trailer is the rangelist-expander: *( ";" range ). This doesn't define that the first <number> of a <range> should be LE the second number. Neither does it allow an open end, like '12-' (to mean: 12 upto the end) and '-11' (to mean: from the start upto 11). my $REnumber = '\d+' ; my $RErange = "$REnumber (?: - $REnumber )?" ; my $RErangelist = "$RErange (?: $RErange )*" ; print qr/ $RErangelist /x ; Alternative: sub REnumber { '\d+' } sub RErange { REnumber, '(?: - ', REnumber, ' )?' } sub RErangelist { RErange, '(?: ', RErange, ' )*' } print qr/ @{[ RErangelist ]} /x ; or even: sub RErangelist { &RErange, '(?: ', &RErange, ' )*' } sub RErange { &REnumber, '(?: - ', &REnumber, ' )?' } sub REnumber { '\d+' } print qr/ @{[ RErangelist ]} /x ; or evener: #!/usr/bin/perl use warnings ; use strict ; sub say { local $\ = "\n"; print @_ } sub RErangelist { sub RErange { sub REnumber { '\d+' } REnumber.'(?: - '.REnumber.' )?' } RErange .'(?: ' .RErange .' )*' } say qr/ @{[ RErangelist ]} /x ; __END__ -- Affijn, Ruud "Gewoon is een tijger." -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>