I guess I’ll just have to remember that once a regex has been compiled with qr//, its d, i, m, s, and x settings are thereafter immutable.

But this is not unusual. To my mind, it is similar to having to remember that the function
    sub func { my $x = 42;  return $x; }
will always return 42 regardless of any value assigned to any global or lexical  $x scalar in any calling scope of the function. The return value of the function is, in a sense, 'immutable' — unless, of course, the function returns a reference to the lexical, which is a whole 'nother ballgame; but regex modifiers have no truck with such referential semantics. In other words, it is purely a scoping question.

Why “and possibly compiles”? Under what circumstances does qr// quote rather than compile, and what difference would this make?

In the discussion of  qr// in the Regexp Quote Like Operators section of perlop, see the paragraphs beginning "Since Perl may compile the pattern..." and "Precompilation of the pattern into an internal representation..." for some light on this question.

As I understand it, a regex object has both an internal representation (for use by the interpreter at run time) and a 'stringized' representation (for the convenience of the programmer, and for interpolation in strings and other regex objects at compile time), along with a bunch of rules for converting between the two. In the example given in perlop, the  qr/$_/i sub-expression in the
    my @compiled = map qr/$_/i, @$patterns;
statement cannot possibly be referred to in its stringized form because no 'hard' or 'soft' reference to it is created; it can therefore be compiled directly to an internal representation.

Similarly, the number 1.2345 has both an internal (IEEE 754, 64-bit) representation (actually, an approximation; see What Every Computer Scientist Should Know About Floating-Point Arithmetic) and a stringized representation (e.g., '1.2345'); if the number is used purely as a number and never printed, it may never exist in its stringized form, but only as its internal representation.


In reply to Re^3: Pattern matching with qr// and modifiers by AnomalousMonk
in thread Pattern matching with qr// and modifiers by Athanasius

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.