| Regexp-Keep documentation | Contained in the Regexp-Keep distribution. |
Regexp::Keep - filter to allow the \K escape in regexes
use Regexp::Keep; # slow and inefficient my $r = "abc.def.ghi.jkl"; $r =~ s/(.*)\..*/$1/; # fast and efficient my $s = "abc.def.ghi.jkl"; $s =~ s/.*\K\..*//;
This allows you to use the \K escape in your regexes, which fools the
regex engine into thinking it has only just started matching your regex.
This means you can turn the inefficient replace-with-itself construct
s/(save)delete/$1/;
into the more efficient
s/save\Kdelete//;
construct.
What \K filters into is .{0}(?{ Regexp::Keep::KEEP }), which is an XS
function call embedded into the regex. The function sets PL_regstartp[0]
to the current location in the string. This means that $& now starts
where \K is seen. That means a replacement will begin being replaced
there.
Here's are short examples to show you the abilities of \K:
"alphabet" =~ /([^aeiou][a-z][aeiou])[a-z]/; # $1 is "pha", $& is "phab" "alphabet" =~ /\K([^aeiou][a-z][aeiou])[a-z]/; # $1 is "pha", $& is "phab" "alphabet" =~ /([^aeiou]\K[a-z][aeiou])[a-z]/; # $1 is "pha", $& is "hab" "alphabet" =~ /([^aeiou][a-z]\K[aeiou])[a-z]/; # $1 is "pha", $& is "ab" "alphabet" =~ /([^aeiou][a-z][aeiou])\K[a-z]/; # $1 is "pha", $& is "b" "alphabet" =~ /([^aeiou][a-z][aeiou])[a-z]\K/; # $1 is "pha", $& is ""
I fixed a bug where \K following a simple thing (like a letter that isn't
followed by a quantifier) didn't work properly.
If you're using this module, you don't have a version of Perl with the \K
escape built-in. Bummer. I should try to make it built-in.
Fixed /a\Kb/ to become /a.{0}\Kb/, which makes a nasty bug disappear.
Original release.
Jeff japhy Pinyan, japhy@pobox.com
Copyright (C) 2004 by japhy
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.3 or, at your option, any later version of Perl 5 you may have available.
| Regexp-Keep documentation | Contained in the Regexp-Keep distribution. |
package Regexp::Keep; use 5.006; use strict; use warnings; use overload; require DynaLoader; our @ISA = qw(DynaLoader); our $VERSION = '0.02'; bootstrap Regexp::Keep $VERSION; my %tr = ( K => '.{0}(?{ Regexp::Keep::KEEP })', ); sub import { overload::constant('qr' => sub { my $raw = shift; $raw =~ s/\\(\C)/$tr{$1} || "\\$1"/eg; return $raw; }) } 1; __END__