note
diotalevi
<p>Just a note: none of this applies if you are using [qr] the way it's meant - as the entire regex for m// or s/// as in <code>$qr = qr/./; $_ = 'abc'; m/$qr/; s/$qr//; $_ =~ $qr</code>. All of these more normal uses of expressions benefit from the precompilation. This note is about interpolating [qr] objects into other regular expressions which is different.</p>
<hr />
<p>Starting from the top: I created the short sample program and then dumped it's opcode tree to see what it actually does. From this I can say that interpolating [qr] objects into another regular expression saves nothing. The objects are all concatenated (meaning stringification) and then compiled for the regex. If you add the /o modifier to any m// or s/// operation then it binds the compiled form to that location in hte opcode tree. There is no reason for that to change just because you used a [qr] in the regex or not. If you read [Dominus]' remarks on that at [http://perl.plover.com/yak/dirty/|Dirty Secrets of the Perl Regex Engine] then that will be clear.</p>
<p>The answers to your questions (in order): <ol><li>I don't know</li><li>no (you are penalized)</li><li>no (you are penalized)</li><li>the same thing it always does</li><li>no (you are penalized)</li></ol> The penalizing is from having to do a magic_get on the [qr] ops instead of just reading it as a string and then the overall penalty of doing work more than once (compile the regex for [qr], mg_get the stringified form, then compile the larger regex). Or at least that's how I read it. Please correct me if I'm wrong - I am still quite a novice at this.</p>
<code>
$qr = qr/./;
'a' =~ /$qr$qr/;
__DATA__
C:\>perl -MO=Concise qr.pl
e <@> leave[t1] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 5 qr.pl:1) v ->3
5 <2> sassign vKS/2 ->6
3 </> qr(/./) s ->4
- <1> ex-rv2sv sKRM*/1 ->5
4 <> gvsv s ->5
6 <;> nextstate(main 5 qr.pl:3) v ->7
d </> match() vKS ->e
7 <$> const(SPECIAL Null)[t5] s ->8
c <|> regcomp(other->d) sK/1 ->d
8 <1> regcreset sK/1 ->9
>> This is where you see the two [qr] expressions
>> being fetched as global scalar values,
>> concatenated and *then* just above this the
>> regex is compiled.
b <2> concat[t4] sK/2 ->c
- <1> ex-rv2sv sK/1 ->a
9 <> gvsv s ->a
- <1> ex-rv2sv sK/1 ->b
a <> gvsv s ->b
</code>
<p>I'm working off of the three references [http://perl.plover .com/Rx/], and [perlop] (the gory quoting part. See also pp_hot.c for pp_concat which doesn't do anything special for [qr] magic. It's just strings at that point.</p>
<code>
__SIG__
use B;
printf "You are here %08x\n", unpack "L!", unpack "P4", pack
"L!", B::svref_2object(sub{})->OUTSIDE;
</code>
218046
218056