"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>


Reply via email to