in reply to Re: Compiled regular expression using qr
in thread Compiled regular expression using qr

Thanks!,

I tired printing both origVal and critVal

data_123 and (?^:data_123)

Apparently data_123 != ?^:data_123 I removed case insensitive in my query string.

  • Comment on Re^2: Compiled regular expression using qr

Replies are listed 'Best First'.
Re^3: Compiled regular expression using qr
by AnomalousMonk (Archbishop) on Oct 15, 2014 at 21:25 UTC

    In the OP and in your reply above, you use the terms "exact" and "case insensitive" in the context of regex matching in a way that leads me to wonder if you understand that case insensitive matching is inherently inexact. E.g.:

    c:\@Work\Perl>perl -wMstrict -le "my $rx = qr/^data_123$/i; print $rx; ;; for my $s (qw(data_123 DATA_123 dAtA_123 data_123x data_12 nada_123) +) { if ($s =~ $rx) { print qq{'exact' match to '$s'}; } else { print qq{NO match to '$s'}; } } " (?^i:^data_123$) 'exact' match to 'data_123' 'exact' match to 'DATA_123' 'exact' match to 'dAtA_123' NO match to 'data_123x' NO match to 'data_12' NO match to 'nada_123'

    Update: I should have mentioned that the example above was run under Strawberry Perl version 5.14.4.1.

      My bad, I reinitialized the variable as part of debugging, no wonder it would not match.

      Thanks for clarifying on its use. That said, the stringify version has ?^ in front, I know that ? means 0 or more of the chars preceding it, but what does ?^ mean?

        A stringized regex object is wrapped in a non-capturing grouping that preserves the regex modifiers in effect when the regex was compiled. This allows a regex object to be unaffected by the modifiers in effect in any enclosing regex 'scope' during interpolation within another regex or regex object. Consider:

        c:\@Work\Perl>perl -wMstrict -le "my $rx = qr/(?^xms:^data_123$)/; print $rx; ;; my $ry = qr/^data_123$/xms; print $ry; ;; my $rz = qr{ T $rx U $ry V }xms; print $rz; " (?^:(?^xms:^data_123$)) (?^msx:^data_123$) (?^msx: T (?^:(?^xms:^data_123$)) U (?^msx:^data_123$) V )
        See also the discussion of  "(?^aluimsx:pattern)" in the Extended Patterns section of perlre.

        ?^ is garbage. (?^i:...), on the other hand, means that the pattern within should be matched case-insensitively as you requested.