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 <dak...@thenautilus.net> wrote: > > On 2019-09-02 The Sidhekin <sidhe...@gmail.com> 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)