Thanks Simon, good point. I ran into the same trouble as others trying to get the answer via regex, and switched over to sets as an alternative. I'll confess I completely missed that Yary's Perl5 code returned the substring "8420" present in his test "19584203" string, and that was the answer he was going for.
Simon and Eirik, I still think there might be some value in calling the .unique method on $chars.comb as in "$chars.comb.unique". But I haven't had the opportunity to check code efficiency +/- the ".unique" method call. For those interested in using Sets as a solution, you can stringifying the 'return' line (below). Still working on using "join()" to concatenate! sub matching_chars(Str $a, Str $b) { my @c = $a.comb.unique; my @d = $b.comb.unique; #return (~[@c (&) @d]).^name; return ~[@c (&) @d]; } say matching_chars("24680", "19584203"); # says 2 0 8 4 say matching_chars('+\/\]\[', 'Apple ][+//e'); # says [ + ] / say matching_chars("Lorem ipsum dolor sit amet, consectetuer adipiscing elit.", "abcdef"); # says c a d e HTH, Bill. PS. Simon, thanks for all the great Youtube videos you've done from LondonPM! https://youtu.be/yt8SrZ_V_50 https://youtu.be/9M1xZQ0_Skw On Sun, Sep 1, 2019 at 9:59 AM Simon Proctor <simon.proc...@gmail.com> wrote: > > Using a set would be good but it doesn't give you the matching string from > the original (which is what I thought was required) otherwise Sets would be > my first thought. > > On Sun, 1 Sep 2019, 17:57 William Michels, <w...@caa.columbia.edu> wrote: >> >> Hi Yary and Paul and Simon, >> >> I ran into the same difficulties as Yary with repeated characters, so >> I tried the .unique method. Then after a while, I realized that >> problems like this might best be treated as "Set" problems in Perl6. >> Note the Set Intersection operator "(&)" below: >> >> sub matching_chars(Str $a, Str $b) { >> my @c = $a.comb.unique; >> my @d = $b.comb.unique; >> #say @c; say @d; >> return @c (&) @d; >> } >> >> say matching_chars("24680", "19584203"); #RETURNS set(0 2 4 8) >> say matching_chars('+\/\]\[', 'Apple ][+//e'); #RETURNS set(+ / [ ]) >> >> >> https://docs.perl6.org/routine/Set >> https://docs.perl6.org/language/operators#infix_(&),_infix_∩ >> >> HTH, Bill. >> >> >> On Sat, Aug 31, 2019 at 8:59 PM Paul Procacci <pproca...@gmail.com> wrote: >> > >> > I'm not entirely sure if this is the correct answer, but if you define >> > your own custom character class >> > with a 'regex' object, you can use that in the grouping. >> > >> > sub matching_chars(Str $chars_to_match, Str $_) { >> > my regex x { $chars_to_match ** 1 }; >> > m/<[<x>]>/; >> > } >> > >> > The above worked for me in the very small testing I did. >> > >> > ~Paul >> > >> > On Sat, Aug 31, 2019 at 9:54 PM yary <not....@gmail.com> wrote: >> >> >> >> I found something easy in Perl 5 that's puzzling me in Perl 6- specifying >> >> a character class via a variable. >> >> >> >> Perl 5: >> >> sub matching_chars { >> >> (my $chars_to_match, local $_) = @_; >> >> /([$chars_to_match]+)/ >> >> } >> >> >> >> say matching_chars('24680', '19584203'); # says 8420 >> >> say matching_chars('+\/\]\[', 'Apple ][+//e'); # says ][+// >> >> >> >> Perl 6: >> >> sub matching_chars(Str $chars_to_match, Str $_) { >> >> # warnings, treats as string not variable >> >> m/<[$chars_to_match]>/; >> >> } >> >> >> >> How do I get Perl 6 to interpret a variable in the contents of a >> >> character class? >> >> From http://docs.perl6.org/language/regexes#Regex_interpolation I'd think >> >> that Rakudo would use the literal contents of $chars_to_match, instead >> >> it's using the literal chars "$ c h a r s _ t o _ m a t c h" and warning >> >> about repeated c, underscore, etc. >> >> >> >> -y >> > >> > >> > >> > -- >> > __________________ >> > >> > :(){ :|:& };: