Because sets are unordered collections of items. And the (&) operator returns a set.
Le dim. 8 sept. 2019 à 00:18, Aureliano Guedes <guedes.aureli...@gmail.com> a écrit : > Why does it dont return ordered for neither of those lists? > I mean: > > my $u = "24680"; > my @s = $u.comb.unique; > say @s ; # [2 4 6 8 0] > > sub matching_chars(Str $a, Str $b) { > my @c = $a.comb.unique; > my @d = $b.comb.unique; > return ~[@c (&) @d]; > } > > say matching_chars("24680", "1234567890"); # says 2 0 8 4 > > On Mon, Sep 2, 2019 at 1:20 AM William Michels via perl6-users < > perl6-us...@perl.org> wrote: > >> 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 >> >> > >> >> > >> >> > >> >> > -- >> >> > __________________ >> >> > >> >> > :(){ :|:& };: >> > > > -- > Aureliano Guedes > skype: aureliano.guedes > contato: (11) 94292-6110 > whatsapp +5511942926110 >