首页 > 解决方案 > perl6 在 AND、OR、NOT 函数的匹配中插入数组

问题描述

我正在尝试重新执行我的程序以匹配数组中的所有项目、匹配任何项目、不匹配项目。Perl6 上的一些文档没有解释当前实现的行为(Rakudo 2018.04),我还有一些问题。

(1)关于正则表达式的文档说,将数组插入匹配正则表达式意味着“最长匹配”;但是,这段代码似乎没有这样做:

> my $a="123 ab 4567 cde";
123 ab 4567 cde
> my @b=<23 b cd 567>;
[23 b cd 567]
> say (||@b).WHAT
(Slip)
> say $a ~~ m/ @b /
 「23」    # <=== I expected the match to be "567" (@b[3] matching $a) which is longer than "23";

(2) (||@b) 是一个 Slip;如何在不显式循环数组的情况下轻松地对数组中的所有元素进行 OR 或 AND?

> say $a ~~ m:g/ @b /
(「23」 「b」 「567」 「cd」)
> say $a ~~ m:g/ ||@b /
(「23」 「b」 「567」 「cd」)
> say $a ~~ m/ ||@b /
 「23」
> say $a ~~ m:g/ |@b /
(「23」 「b」 「567」 「cd」)
> say $a ~~ m:g/ &@b /
(「23」 「b」 「567」 「cd」)
> say $a ~~ m/ &@b /
 「23」
> say $a ~~ m/ &&@b /
 「23」    # <=== && and & don't do the AND function

(3) 我最终做的是将我以前的代码压缩成两行:

my $choose = &any; # can prompt for choice of any, one, all, none here;
say so (gather { for @b -> $z { take $a ~~ m/ { say "==>$_ -->$z"; } <{$z}> /; } }).$choose;

正如预期的那样,输出是“真”。但我希望有一种更简单的方法,没有“收集”和“for”循环。

非常感谢您的任何见解。

lisprog

标签: arraysmatchinterpolationraku

解决方案


(1)关于正则表达式的文档说,将数组插入匹配正则表达式意味着“最长匹配”;但是,这段代码似乎没有这样做:

实际规则是正则表达式首先找到最左边的匹配项,然后找到最长的匹配项。

但是,最左边的规则对于所有正则表达式匹配都是正确的,这就是为什么正则表达式文档在谈论交替时没有明确提及它的原因。

(2) (||@b) 是一个 Slip;如何在不显式循环数组的情况下轻松地对数组中的所有元素进行 OR 或 AND?

您始终可以先将正则表达式构造为文本:

my $re_text = join '&&', @branches;
my $regex   = re/ <$re_text> /;

推荐阅读