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

Reply via email to