On 2016-01-17 Tom Browder <[email protected]> wrote:
> My question: Is there a way to have Perl 6 do the required escaping
> for the regex programmatically, i.e., turn this:
>
> my $str = '/home/usr/.cpan';
>
> into this:
>
> my regex dirs {
> \/home\/usr\/\.cpan
> }
>
> automatically?
Yes! And it's also simpler than in Perl 5. I Perl 5, you would have to
do something like:
my $dirs = qr{\Q$str};
but in Perl 6 you just do:
my $dirs = regex { $str };
because the other behaviour, to interpret the contents of $str as
another regex to match, has more explicit syntax:
regex { <$another_regex> }
For your initial use-case there is also another shortcut: an array is
interpreted as an alternation, so you could write:
my @dirs = < /home/user/.cpan /home/tbrowde/.emacs >;
my $regex = regex { @dirs };
and it would do what your Perl 5 example does.
If you want to be more restrictive, you can anchor the alternation:
my $regex = regex { ^ @dirs };
Here is a complete program:
use v6;
my @dirs = < foo bar baz >;
my $matcher = regex { ^ @dirs $ };
for $*IN.lines -> $line {
if $line ~~ $matcher {
say "<$line> matched";
}
else {
say "<$line> didn't match";
}
}
--
Dakkar - <Mobilis in mobile>
GPG public key fingerprint = A071 E618 DD2C 5901 9574
6FE2 40EA 9883 7519 3F88
key id = 0x75193F88
To spot the expert, pick the one who predicts the job will take the
longest and cost the most.