#!/usr/bin/perl use Benchmark 'timethese'; $rCODE = reverse ($CODE = << 'END'); int x = 10; str y = "cool \" beans"; if (len(y) GREATER_THAN x) { print y, " is longer than ", x, " characters"; <> chop(y,x); print "I sliced 'y' down to ", x, " characters for you"; } END ($last) = $CODE =~ m{ \A (?: <[^<>]*> | " [^"\\]* (?: \\. [^"\\]* )* " | (?>[^"<>]*) )* (<[^<>]*>) (?: " [^"\\]* (?: \\. [^"\\]* )* " | (?>[^"<>]*) )* \z }x; print "forwards: $last\n"; $last = scalar reverse((reverse $CODE) =~ m{ \A (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) )* (>[^<>]*<) (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) | >[^<>]*< )* \z }x); print "backwards: $last\n"; $last = scalar reverse($rCODE =~ m{ \A (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) )* (>[^<>]*<) (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) | >[^<>]*< )* \z }x); print "backcache: $last\n"; timethese(-15, { 'forwards' => << 'END', ($last) = $CODE =~ m{ \A (?: <[^<>]*> | " [^"\\]* (?: \\. [^"\\]* )* " | (?>[^"<>]*) )* (<[^<>]*>) (?: " [^"\\]* (?: \\. [^"\\]* )* " | (?>[^"<>]*) )* \z }x; END 'backwards' => << 'END', $last = scalar reverse((reverse $CODE) =~ m{ \A (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) )* (>[^<>]*<) (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) | >[^<>]*< )* \z }x); END 'back+cache' => << 'END', $last = scalar reverse($rCODE =~ m{ \A (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) )* (>[^<>]*<) (?: " (?: [^"\\]* .\\ )* [^"\\]* " | (?>[^"<>]*) | >[^<>]*< )* \z }x); END });