Defining Your Own Assertions
You can’t (easily: see next section) change how Perl’s Engine works, but if you’re sufficiently warped, you can change how it sees your pattern. Since Perl interprets your pattern similarly to double-quoted strings, you can use the wonder of overloaded string constants to see to it that text sequences of your choosing are automatically translated into other text sequences.
In the example below, we specify two transformations to occur when
Perl encounters a pattern. First, we define \tag so that, when it appears in a pattern,
it’s automatically translated to (?:<.*?>), which matches most HTML and
XML tags. Second, we “redefine” the \w metasymbol so that it handles only English
letters.
We’ll define a package called Tagger that hides the overloading from our
main program. Once we do that, we’ll be able to say:
use Tagger; $_ = "<I>camel</I>"; say "Tagged camel found" if /\tag\w+\tag/;
Here’s Tagger.pm, couched in the form of a Perl module (see Chapter 11):
package Tagger;
use overload;
sub import { overload::constant "qr" => \&convert }
sub convert {
my $re = shift;
$re =~ s/ \\tag /<.*?>/xg;
$re =~ s/ \\w /[A–Za–z]/xg;
return $re;
}
1;The Tagger module is handed the
pattern immediately before interpolation, so you can bypass the
overloading by bypassing interpolation, as follows:
$re = '\tag\w+\tag'; # This string begins with \t, a tab print if /$re/; # Matches a tab, followed by an "a"...
If you wanted the interpolated variable to be customized, call the
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access