arrays - 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
解决方案
(1)关于正则表达式的文档说,将数组插入匹配正则表达式意味着“最长匹配”;但是,这段代码似乎没有这样做:
实际规则是正则表达式首先找到最左边的匹配项,然后找到最长的匹配项。
但是,最左边的规则对于所有正则表达式匹配都是正确的,这就是为什么正则表达式文档在谈论交替时没有明确提及它的原因。
(2) (||@b) 是一个 Slip;如何在不显式循环数组的情况下轻松地对数组中的所有元素进行 OR 或 AND?
您始终可以先将正则表达式构造为文本:
my $re_text = join '&&', @branches;
my $regex = re/ <$re_text> /;
推荐阅读
- c# - Prism + DryIoc 在尝试执行构造函数注入时崩溃?
- android - 如何从另一个 Android 应用程序小部件访问信息?
- php - PHP 代码查找从 html 表单获取用户输入的第二大数字
- haskell - 关于评价顺序
- .net - 删除 Webbrowser1 cookie 和缓存 .net
- keras - Keras Metric 奇怪的行为
- java - JNI - 如何将“jint”参数转换为“unsigned int”C 类型值
- javascript - 使用节点检查时未定义预期变量?
- javafx - 如何将列表的大小属性绑定到节点的禁用属性?
- python - 多尺度掩模图像质心问题