http://qs321.pair.com?node_id=218104


in reply to Re^4: meaning of /o in regexes
in thread meaning of /o in regexes

The task that started me on the quest for speed was indeed a monster regex, it was also being called many times in a tight loop. As the regex was essentially repetitious, I originally thought that compiling the base regex with qr// and then using that in conjuction with a repeat count and the none repeating elements also compliled with /o might leach some benefits, but the reverse was true. I settled for programically generating the regex (using x n) into a single large regex and then compiling it with qr// (which appeared to give some slight performance benefit over /o). This was possibly due to the fact that when compiled with qr//, you can use the resultant variable directly ($string =~ $compiled_re) rather than needing to embed it within an m// operator (m/$compiled_re/). Maybe its slightly quicker to execute the former than the latter? The difference seemed significant enough to make it worthwhile..


Okay you lot, get your wings on the left, halos on the right. It's one size fits all, and "No!", you can't have a different color.
Pick up your cloud down the end and "Yes" if you get allocated a grey one they are a bit damp under foot, but someone has to get them.
Get used to the wings fast cos its an 8 hour day...unless the Govenor calls for a cyclone or hurricane, in which case 16 hour shifts are mandatory.
Just be grateful that you arrived just as the tornado season finished. Them buggers are real work.

Replies are listed 'Best First'.
Re^6: meaning of /o in regexes
by diotalevi (Canon) on Dec 06, 2002 at 17:36 UTC

    You are slightly wrong: <code$qr = qr/./; $qr =~ m/$qr/; $qr =~ $qr;</code> is exactly identical. Again, some opcode info to illuminate. It also yields the slightly interesting form $text = 'abcd'; $text =~ qr/./ but then... maybe that's not quite normal ;-)

    i <@> 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:2) v ->7 >> Here you see the $qr =~ m/$qr/ form b </> match() vKS ->c - <1> ex-rv2sv sK/1 ->8 7 <> gvsv s ->8 a <|> regcomp(other->b) sK/1 ->b 8 <1> regcreset sK/1 ->9 - <1> ex-rv2sv sK/1 ->a 9 <> gvsv s ->a >> And here you see the $qr =~ $qr form c <;> nextstate(main 5 qr.pl:3) v ->d h </> match() vKS ->i - <1> ex-rv2sv sK/1 ->e d <> gvsv s ->e g <|> regcomp(other->h) sK/1 ->h e <1> regcreset sK/1 ->f - <1> ex-rv2sv sK/1 ->g f <> gvsv s ->g
    __SIG__ use B; printf "You are here %08x\n", unpack "L!", unpack "P4", pack "L!", B::svref_2object(sub{})->OUTSIDE;