perl6 How to use junction inside regex interpolation?

血红的双手。 提交于 2021-02-08 13:14:41

问题


Sometimes I have a long list and I would like to check whether a string matches anything in the list. I am trying to interpolate a junction inside a regex. They are all errors.

say "12345" ~~ m/ <{ (2,3,4).any }> /
Cannot resolve caller MAKE_REGEX(Int, Bool, Bool, Int, PseudoStash); none of these signatures match:

say "12345" ~~ m/ $( (2,3,4).any ) /
This type cannot unbox to a native string: P6opaque, Junction

Does this error message mean that junctions cannot be used inside regex interpolation?

The work-around I have is

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」

Any suggestions as to use junctions inside regex interpolation?

Thank you very much !!!

lisprog


回答1:


Sometimes I have a long list and I would like to check whether a string matches anything in the list.

Use a list, not a Junction:

my @list = <bar bartoo baragain>;
say 'bartoo' ~~ / @list /;                         # 「bartoo」
say 'bartoo' ~~ / <{<bar bartoo baragain>}> /;     # 「bartoo」

Note that by default you get the longest matching token.

I am trying to interpolate a junction inside a regex. They are all errors. ... Does this error message mean that junctions cannot be used inside regex interpolation?

I think so. (The error message is perhaps LTA.) Junctions are a feature of the main P6 language. It seems reasonable that the pattern matching DSL doesn't support them.

The work-around I have is

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」

If you join with a doubled pipe (||) then you get the first token that matches rather than the longest:

say 'bartoo' ~~ / <{'bar || bartoo || baragain'}> /; # 「bar」
say 'bartoo' ~~ / ||@list /;                         # 「bar」
say 'bartoo' ~~ / ||<{<bar bartoo baragain>}> /;     # 「bar」

Not specifying the pipe symbol for these constructs is the same as specifying a single pipe symbol (|) and matches the longest matching token:

say 'bartoo' ~~ / <{'bar | bartoo | baragain'}> /; # 「bartoo」
say 'bartoo' ~~ / |@list /;                        # 「bartoo」
say 'bartoo' ~~ / |<{<bar bartoo baragain>}> /;    # 「bartoo」

You've asked related questions before. I'll add links to a couple of them here for convenience:

  • Is using junctions in matching possible?

  • Interpolate array in match for AND, OR, NOT functions



来源:https://stackoverflow.com/questions/53992260/perl6-how-to-use-junction-inside-regex-interpolation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!