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/