perl6 空匹配对象是真的吗?将 Set.one/all 变量插入正则表达式
perl6 Empty match object is True? Interpolating Set.one/all variables into regex
做事有不同的方法。我想要做的是 (A) 匹配一个 Set 中的任何模式,以及 (B) 以任何顺序匹配一个 Set 中的所有模式。例如,如果一个集合是 (1,2,3),则如果字符串包含 1、或 2、或 3,则 (A) 为真; (B) 如果字符串以任意顺序包含 1、2 和 3,则为真。
前一段时间,smls用数组回答了一个问题:(感谢smls);但这次我想使用 Set,如果可能的话使用 .one 和 .all,因为使用 Set 可以显着简化我程序的其他部分。
我使用的是 Rakudo 的 7 月版。这是一个成绩单。谢谢!!!
To exit type 'exit' or '^D'
> my $a = < one two 3 >
(one two 3)
> do "two" ~~ $a.one
True
> so 4 ~~ $a.one
False
> so "zzzonezz" ~~ $a.one
False
> my $b = "one"
one
> so "zzonezz" ~~ m/ {$b} / # trying to interpolate into regex
True
> so "zzzonezz" ~~ m/ { $a.one } / # trying to interpolate into regex
True
> say "zzzonezz" ~~ m/ { $a.one } /
「」 # empty match is True ?????
> my $c = "zzzonezz" ~~ m/ { $a.one } /
「」 # why is the match empty and not "one"?
> so "zzonezz" ~~ m/ $b /
True
> my $c = "zzzonezz" ~~ m/ $a.one / # $b above is evaluated,
# how come this one isn't evaluated ??
# why either /{$b}/ or /$b/ works, but only /{$a.one}/ works and
# /$a.one/ doesn't ???
False
> so "xxonetwo3xx" ~~ m/ { $a.all } /
True
> so "xxone 3 twoxx" ~~ m/ { $a.all } / # seems to work
True
> so "xxone 3 twoxx" ~~ m/ $a.all /
False
m/ {$b} /
匹配的原因与 m/ {False} /
匹配的原因相同。正则表达式中的普通裸块(通常)不会影响它是否匹配。
基本上 m/ {} /
是一个空正则表达式,就好像你使用了 m/ '' /
.
在这种情况下你想要的是使用<{…}>
my $a = < one two 3 >;
my $b = "one";
so "zzonezz" ~~ m/ $b /; # True
so "zz zz" ~~ m/ $b /; # False
so "zzonezz" ~~ m/ <{ $b }> /; # True
so "zz zz" ~~ m/ <{ $b }> /; # False
在$a
的情况下,您需要做的就是向其添加@
。 (或将其命名为 @a
)
so "zzonezz" ~~ m/ @$a /; # True
so "zz zz" ~~ m/ @$a /; # False
so "zzonezz" ~~ m/ <{ @$a }> /; # True
so "zz zz" ~~ m/ <{ @$a }> /; # False
或者做一些其他的事情来取消逐条列出它。
so "zzonezz" ~~ m/ <{ $a.list }> /; # True
so "zz zz" ~~ m/ <{ $a.list }> /; # False
你也可以这样做。
so "zzonezz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # True
so "zz zz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # False
请注意,<?{…}>
是零宽度断言,如果结果为真,则成功。
还有<!{…}>
做相反的事情
要使用 Set,目前需要调用 .keys
方法将其放入列表中。
my $c = $a.Set;
so "zzonezz" ~~ m/ @( $c.keys ) /; # True
so "zz zz" ~~ m/ @( $c.keys ) /; # False
so "zzonezz" ~~ m/ <{ $c.keys }> /; # True
so "zz zz" ~~ m/ <{ $c.keys }> /; # False
做事有不同的方法。我想要做的是 (A) 匹配一个 Set 中的任何模式,以及 (B) 以任何顺序匹配一个 Set 中的所有模式。例如,如果一个集合是 (1,2,3),则如果字符串包含 1、或 2、或 3,则 (A) 为真; (B) 如果字符串以任意顺序包含 1、2 和 3,则为真。
前一段时间,smls用数组回答了一个问题:
我使用的是 Rakudo 的 7 月版。这是一个成绩单。谢谢!!!
To exit type 'exit' or '^D'
> my $a = < one two 3 >
(one two 3)
> do "two" ~~ $a.one
True
> so 4 ~~ $a.one
False
> so "zzzonezz" ~~ $a.one
False
> my $b = "one"
one
> so "zzonezz" ~~ m/ {$b} / # trying to interpolate into regex
True
> so "zzzonezz" ~~ m/ { $a.one } / # trying to interpolate into regex
True
> say "zzzonezz" ~~ m/ { $a.one } /
「」 # empty match is True ?????
> my $c = "zzzonezz" ~~ m/ { $a.one } /
「」 # why is the match empty and not "one"?
> so "zzonezz" ~~ m/ $b /
True
> my $c = "zzzonezz" ~~ m/ $a.one / # $b above is evaluated,
# how come this one isn't evaluated ??
# why either /{$b}/ or /$b/ works, but only /{$a.one}/ works and
# /$a.one/ doesn't ???
False
> so "xxonetwo3xx" ~~ m/ { $a.all } /
True
> so "xxone 3 twoxx" ~~ m/ { $a.all } / # seems to work
True
> so "xxone 3 twoxx" ~~ m/ $a.all /
False
m/ {$b} /
匹配的原因与 m/ {False} /
匹配的原因相同。正则表达式中的普通裸块(通常)不会影响它是否匹配。
基本上 m/ {} /
是一个空正则表达式,就好像你使用了 m/ '' /
.
在这种情况下你想要的是使用<{…}>
my $a = < one two 3 >;
my $b = "one";
so "zzonezz" ~~ m/ $b /; # True
so "zz zz" ~~ m/ $b /; # False
so "zzonezz" ~~ m/ <{ $b }> /; # True
so "zz zz" ~~ m/ <{ $b }> /; # False
在$a
的情况下,您需要做的就是向其添加@
。 (或将其命名为 @a
)
so "zzonezz" ~~ m/ @$a /; # True
so "zz zz" ~~ m/ @$a /; # False
so "zzonezz" ~~ m/ <{ @$a }> /; # True
so "zz zz" ~~ m/ <{ @$a }> /; # False
或者做一些其他的事情来取消逐条列出它。
so "zzonezz" ~~ m/ <{ $a.list }> /; # True
so "zz zz" ~~ m/ <{ $a.list }> /; # False
你也可以这样做。
so "zzonezz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # True
so "zz zz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # False
请注意,<?{…}>
是零宽度断言,如果结果为真,则成功。
还有<!{…}>
做相反的事情
要使用 Set,目前需要调用 .keys
方法将其放入列表中。
my $c = $a.Set;
so "zzonezz" ~~ m/ @( $c.keys ) /; # True
so "zz zz" ~~ m/ @( $c.keys ) /; # False
so "zzonezz" ~~ m/ <{ $c.keys }> /; # True
so "zz zz" ~~ m/ <{ $c.keys }> /; # False