On 2019-09-02 The Sidhekin <[email protected]> wrote:
> To have the (1-character) strings used a literals, rather than
> compiled as subrules, put them in an array instead of a block wrapped
> in angle brackets:
>
> sub contains( Str $chars, Str $_ ) {
> my @arr = $chars.comb;
> m:g/@arr+/
This looks to be the correct solution. Notice that yary's initial code
had::
matching_chars('+\/\]\[', 'Apple ][+//e')
but those backslashes are an implementation artefact (the Perl5
version interpolates the given string into a regex without calling
``quotemeta``).
If we remove the backslashes, Sidhekin's code works::
#!perl6
use v6;
use Test;
sub matching_chars(Str $chars_to_match, Str $target) {
my @chars-to-match = $chars_to_match.comb;
return $target ~~ m:g/@chars-to-match + /;
}
is matching_chars("24680", "19584203"),['8420'];
is matching_chars("Lorem ipsum dolor sit amet, consectetueradipiscing elit.",
"abcdef"), ['a','cde'];
is matching_chars('+/][', 'Apple ][+//e'),['][+//'];
is matching_chars('24680', '19584203'),['8420'];
is matching_chars('24680', '24680x'),['24680'];
is matching_chars('246','13 91 1462 7'),['462'];
done-testing;
--
Dakkar - <Mobilis in mobile>
GPG public key fingerprint = A071 E618 DD2C 5901 9574
6FE2 40EA 9883 7519 3F88
key id = 0x75193F88
Just because it's not nice doesn't mean it's not miraculous.
-- (Terry Pratchett, Interesting Times)