arrays - perl6 插入数组以匹配 AND、OR、NOT 函数

标签 arrays match interpolation raku

我正在尝试重新执行我的程序,以匹配数组中的所有项目、匹配任何项目、不匹配任何项目。 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) 是一张单据;如何在不显式循环数组的情况下轻松地对数组中的所有元素进行 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;

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

非常感谢您的任何见解。

lisprog

最佳答案

(1) Documentation on regex says that interpolating array into match regex means "longest match"; however, this code does not seem to do so:



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

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

(2) (||@b) is a Slip; how do I easily do OR or AND of all the elements in the array without explicitly looping through the array?



您始终可以首先将正则表达式构建为文本:
my $re_text = join '&&', @branches;
my $regex   = re/ <$re_text> /;

关于arrays - perl6 插入数组以匹配 AND、OR、NOT 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50829126/

相关文章:

python - 如何根据 python 中另一个数组中的关键字查找数组中的字符串?

python - 使用 Pandas 在日期的两个时间之间进行插值

javascript - 遍历两个(不同长度的)数组以产生交替输出

javascript - 如何将部分 Redux 存储转换为数组

python - 比较python中的两个列表并返回匹配值的索引

正则表达式:捕获组内的捕获组

python - 缺少多天数据时用 NaN 填充数据框

java - 数组中第二小的数字 - 输出不正确

c - 在 C 中搜索二进制模式(读取缓冲的二进制文件)