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 >>> > >>> > >>> > >>> > -- >>> > __________________ >>> > >>> > :(){ :|:& };: >>> >> -- __________________ :(){ :|:& };: