Hi Gianni,
Thank you for demonstrating use of the "Test" module in your code.
Just a short note that Eirik's array-based code seems to work fine,
with-or-without backslash-escaping the first input string (minimal
testing, below):
sub contains( Str $chars, Str $_ ) {
my @arr = $chars.comb;
m:g/@arr+/
}
say contains('+\/\]\[', 'Apple ][+//e'); # returns (「][+//」)
say contains('+/][', 'Apple ][+//e'); # returns (「][+//」)
HTH, Bill.
On Mon, Sep 2, 2019 at 10:15 AM Gianni Ceccarelli
<[email protected]> wrote:
>
> 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)