Hi Aureliano! Others will certainly have a more informed answer, but I think it might be because:
1). Set operations in general in Perl6 (on characters, etc.) may use a unordered matching algorithm to enhance speed, and/or 2). I didn't explicitly call a "Sort" method, function or routine in matching the characters, and/or 3). The resulting character order (probably represented internally as Unicode codepoints), may indeed have some sort of order to them, but that order/pseudo-order is either A. related to their initial position in the input string (0,1,2,3...), or B. that order/pseudo-order is related to each character's numeric representation in Unicode. Below I convert the code to accept two integers instead of two strings. I set up a few different "return" lines for you to check out. You will see that the (second) "return" line that calls ".sort" as the last method indeed returns a set of integers in numerical order! But it also looks as though the (first) return line without an explicit ".sort" call ALSO returns the Intersection Set in numerical order, "(set(0 2 4 6 8))". my Int $u = 24680; my @s = $u.comb.unique; say @s ; # [2 4 6 8 0] sub matching_chars(Int $a, Int $b) { my @c = $a.comb.unique; my @d = $b.comb.unique; #return @c (&) @d; # Returns Intersection Set (Ints) #return [@c (&) @d].sort; # Returns Sorted Set (Ints) return [@c (&) @d].sort.Str; # Returns varying order (Strs) } say matching_chars(24680, 1234567890); # RETURNS (set(0 2 4 6 8)) So I think Perl6 may have fast integer matching/sorting algorithms built-in, but the built-in matching/sorting algorithms for characters may be somewhat different, different enough to require a explicit/final (e.g. alphabetic) sort, if that's what the programmer desires. HTH, Bill. On Sun, Sep 1, 2019 at 10:10 PM Aureliano Guedes <guedes.aureli...@gmail.com> wrote: > > 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