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

-- 
__________________

:(){ :|:& };:

Reply via email to