Richard Lee wrote:
> Chas. Owens wrote:
>>> w? And why?
>>>     
>> snip
>>
>> how:
>>
>> my $pattern = '.*(?:' . join('|', map quotemeta, @ARGV) . ')';
>> $pattern = qr/$pattern/;
>>
>> why:
>>
>> To compile the regex.  In the original program, the regexes use the o
>> modifier to promise that $pattern won't change so the optimizer can
>> compile the regexes once, but if you use qr// then you don't have to
>> make that promise and you still only compile the regex once.
>>
>>
>>
>>   
> thanks Chas, I have cheat sheet on my monitor and I only had qr as regex, I
> am making a note on the fact that it actually compile only once regex and 
> should not be used at all time to do regex build.

qr// isn't often necessary, as they are usually defined, compiled and used at
the same point, like constants. However, if you have a regex that you need to
use in several places in your code then it can be useful to declare it
separately, like

  my $bracketed = qr/^\{.*\}$/;

  foreach my $element (@a) {
    print if $element =~ $bracketed;
  }

  foreach my $element (@b) {
    print if $element =~ $bracketed;
  }

It can also be useful for building complex regexes:

my $number = qr/\b[0-9]+\b/;
my $alphachar = qr/[A-Z]/i;
my $identifier = qr/\b$alphachar\w*\b/;
my $value = qr/(?:$number|$identifier)/;
my $assignment = qr/$identifier\s*=\s*$value/;


As a separate idea, the /o qualifier on a regex asks that it is compiled only
the first time it is encountered. This makes no difference unless it contains
interpolated variables, but the behavior can be seen in this program

use strict;
use warnings;

foreach my $char ('A' .. 'Z') {
  my $re = qr/$char/o;
  print "$char" if $char =~ $re;
}
print "\n";

foreach my $char ('A' .. 'Z') {
  my $re = qr/$char/;
  print "$char" if $char =~ $re;
}
print "\n";


HTH,

Rob

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to