Hi Paul, Neither of those match for me- adapted below
#!/usr/bin/env perl6 use v6; sub matching_chars(Str $match, Str $y) { say 'eval = ', $y.match: /<{ "<[$match]>" }>/; say 'direct= ', $y.match: /<[$match]>/; my $rematch := $match; say 'bound = ', $y.match: /<[$rematch]>/; say 'orig $match=',$match.perl, ' vs $rematch=',$rematch.perl; } matching_chars('246','13 91 1462 7'); Prints *eval = 「4」* *direct= Nil* *bound = Nil* *orig $match="246" vs $rematch="246"* I'd expect working match to say '4' as the first matching character from '246', instead your example gives me Nil with both. Can you post the full code that has one working, other non-working? -y On Sun, Sep 1, 2019 at 12:53 PM Paul Procacci <pproca...@gmail.com> wrote: > I've actually found some weird inconsistancy while playing with this. > > sub matching_chars(Str $x, Str $y) { > my $a := $x; > my $b := $y; > say $y.match: /<[$a]>/; > } > > That results in a match of one character, yet: > > sub matching_chars(Str $x, Str $y) { > my $a := $x; > my $b := $y; > say $y.match: /<[$x]>/; > } > > Results in a match of none of the characters. Yet, $x and $a should > reference the same object. > Something is broken. > > On Sun, Sep 1, 2019 at 2:39 PM yary <not....@gmail.com> wrote: > >> Thanks for the ideas. The core issue I'm probing is runtime construction >> of character classes, with an eye towards opening a documentation issue, or >> maybe even an issue against the character class implementation. >> >> Simon's workaround m:g/<{$chars.comb}>+/ is interesting, interpolating >> a list which turns into alternation - but it isn't a character class. >> Bill's proposal with intersecting sets - via a junction, though ∩ aka (&) >> also ought to work - is short and clear, but solves a different problem. >> >> Paul's suggestion should create a character class, but my test doesn't >> work: >> >> #!/usr/bin/env perl6 >> use v6; >> >> sub matching_chars(Str $chars_to_match, Str $_) { >> print "Looking for $chars_to_match in '$_'- "; >> my regex x { $chars_to_match ** 1 }; >> m/<[<x>]>/; >> } >> say matching_chars('24680', '19584203'); >> say matching_chars('24680', '24680x'); >> >> $ ./*match.p6* >> Looking for 24680 in '19584203'- Nil >> Looking for 24680 in '24680x'- 「x」 >> >> Paul, can you post a more complete working test? >> >> The below works but is "ugly", building up the character class syntax as >> a string and then evaluating it >> >> sub matching_chars(Str $chars_to_match, Str $_) { >> print "Looking for $chars_to_match in '$_'- "; >> >> m/<{ # Interpolate contents as a regex >> "<[" ~ # Open the character class >> # Add the char list, with closing bracket backslashed >> $chars_to_match.subst(']','\]' ,:g) ~ >> "]>" # Close the character class >> }>+/; # End interpolation, plus sign for one-or-more >> } >> say matching_chars('24680', '19584203'); # matches 8420 >> say matching_chars('+/][', 'Apple ][+//e'); # matches ][+// >> >> I see this as a shortcoming in the character class implementation. >> Specifically the "literal" vs "metacharacter" distinction >> <http://docs.perl6.org/language/regexes#Literals_and_metacharacters> >> goes out the window with enumerated character classes, it behaves like a >> single-quoting. I want all the different interpolation goodness >> <http://docs.perl6.org/language/regexes#Regex_interpolation> to work >> with character classes, and it seems that requires a new syntax. >> >> -y >> >> >> 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 >>>> > >>>> > >>>> > >>>> > -- >>>> > __________________ >>>> > >>>> > :(){ :|:& };: >>>> >>> > > -- > __________________ > > :(){ :|:& };: >