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

2023-11-27

我正在尝试重新执行我的程序,以匹配数组中的所有项目、匹配任意项目、不匹配项目。 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;

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

非常感谢您的任何见解。

lisprog


在 AND、OR、NOT 函数的匹配中插入数组

我不知道还有比莫里茨更好的解决方案AND.

I cover OR below.

一种自然的写法NOT匹配标记列表的方法是使用 a 的否定版本展望或后向断言,例如:

my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;
say $_>>.pos given $a ~~ m:g/ <!before @b> /;

显示:

(0 2 3 4 6 7 9 10 11 13 14 15)

这是12场比赛的位置not 23, b, cd, or 567在字符串中"123 ab 4567 cde",由线所示^下面的 s 指向匹配的每个字符位置:

my $a="123 ab 4567 cde";
       ^ ^^^ ^^ ^^^ ^^^
       0123456789012345

我正在尝试重新执行我的程序,以匹配数组中的所有项目、匹配任意项目、不匹配项目。

这些听起来像路口,而你问题的其余部分显然都是关于路口的。如果您链接到现有程序,可能会让我/其他人更容易看到您正在尝试执行的操作。

(1)

||@b匹配leftmost匹配令牌@b,不是longest one.

Write |@b,有一个single |, 来匹配longest匹配令牌@b。或者,更好的是,简单地写@b,这是同一件事的简写。

这两个匹配模式(|@b or ||@b) 与任何其他匹配模式一样,都受正则表达式引擎工作方式的影响,如 Moritz 所简要描述的以及下面更详细的描述。

当正则表达式引擎将正则表达式与输入字符串进行匹配时,它从正则表达式的开头和输入字符串的开头开始。

如果无法匹配,它会跳过输入字符串中的第一个字符,放弃该字符,并假装输入字符串从其起始位置开始。second特点。然后它再次尝试匹配,从正则表达式的开头但输入字符串的第二个字符开始。它会重复此操作,直到到达字符串末尾或找到匹配项。

根据您的示例,引擎在开始时无法匹配123 ab 4567 cde但成功匹配23从第二个字符位置开始。这样就完成了——然后567在你的匹配模式中是无关紧要的。

获得您期望的答案的一种方法:

my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;

my $longest-overall = '';
sub update-longest-overall ($latest) {
  if $latest.chars > $longest-overall.chars {
    $longest-overall = $latest
  }
}

$a ~~ m:g/ @b { update-longest-overall( $/ ) } /;

say $longest-overall;

显示:

「567」

指某东西的用途:g下面解释。

(2)

|@b or ||@b主线代码中的含义与正则表达式中的含义完全无关。如你看到的,|@b是相同的@b.Slip. ||@b means @b.Slip.Slip其评估结果为@b.Slip.

进行“平行”最长比赛模式获胜OR的元素的@b, write @b (or |@b) 在正则表达式中.

进行“顺序”最左匹配模式获胜OR的元素的@b, write ||@b在正则表达式内。

到目前为止我一直无法弄清楚什么& and &&do 当用于在正则表达式中为数组添加前缀时。在我看来,有多个与它们的使用相关的错误。

在您问题的某些代码中,您指定了:g副词。这指示引擎在找到匹配项时不会停止,而是跳过刚刚匹配的子字符串,并开始尝试在输入字符串中进一步匹配。

(还有其他副词。the:ex副词是最极端的。在这种情况下,当输入字符串中的给定位置存在匹配项时,引擎会尝试匹配任何其他匹配模式在同一个位置在正则表达式和输入字符串中。无论积累了多少匹配项,它都会继续执行此操作,直到尝试了正则表达式和输入字符串中该位置的所有最后可能的匹配项。只有当它用尽所有这些可能性时,它才会在输入字符串中向前移动一个字符,并再次尝试彻底匹配。)

(3)

我最好的镜头:

my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;
my &choose = &any;
say so choose do for @b -> $z {
  $a ~~ / { say "==>$a -->$z"; } $z /
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

perl6 插入数组以匹配 AND、OR、NOT 函数 的相关文章

随机推荐

  • Node.js 中的“未捕获的语法错误:意外的标记 <”

    当我尝试提供客户端代码时 出现以下屏幕截图错误 当我尝试跑步时node server server js 下面是我的服务器 js code app use express static path join dirname public ap
  • 如何在 python 中进行模拟并仍然允许执行模拟函数的实际代码

    我最近开始使用 python 中的模拟框架 似乎如果我修补一个函数 则不会调用实际代码 这意味着该实际函数所做的数据库更改等未实现 我一直试图通过预先调用该函数并存储返回值并将其作为 arg 在 patch 中传递来绕过它 但是 有更好的方
  • Android:如何获取当前设备 WiFi-direct 名称

    在 P2P 设置中 我了解如何获取另一个设备的名称 但如何获取我自己的设备的名称 设置下的 WiFi direct 中显示的那个 我检查过WiFiManager WiFiInfo 还有更多没有成功 打开设备上的 wifi 后 它会发送 WI
  • 有条件地选择 MYSQL 列

    我的问题的示例架构位于SQLFiddle如下 CREATE TABLE players player1id int 11 NOT NULL player2id int 11 NOT NULL PRIMARY KEY player1id pl
  • Swift 核心数据谓词 IN 子句

    我正在尝试将 IN 子句与 NSPredicate 一起使用 我收到以下错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 NSTaggedPointerString countByEnume
  • NSMakeRange(i, 1) 是什么意思?

    我刚刚开始学习iOS 什么是 NSMakeRange i 1 意思是 for int i 0 i lt name length i NSRange range NSMakeRange i 1 NSString subString name
  • 在 php 中创建 web 服务是否需要 wsdl 文件?

    我的问题需要对网络服务有一些基本的了解 更具体地说 与 php 结合使用 我想知道 是否需要有一个 wsdl 文件来创建 Web 服务 或者这对想要访问 Web 服务的第三方有用 另外 它在 net环境中自动生成 但对于php来说有点困难
  • 5 张图像,用对角线对称分隔

    我浏览互联网并在 Reddit 上偶然发现了这个主题 看到这个可爱的横幅后 我想尝试使用我选择的五个对称图像来模拟类似的东西 这些图像由对角线分隔 就像上图一样 也许还可以尝试在各种图像上添加一些文字 像这样的东西 我尝试使用猫图片在 cs
  • 找不到查询模式的实现

    在我的 silverlight 应用程序中 我尝试使用 LINQ 创建数据库连接 首先 我添加一个新的 LINQ to SQL 类 并将名为 tblPerson 的表拖入其中 然后在我的服务文件中我尝试执行以下查询 OperationCon
  • 在 React 应用程序中加载初始服务器数据的逻辑应该放在哪里?

    我正在使用 React Redux 来构建一个应用程序 要加载 React 智能组件的初始数据 我需要调度一个Redux服务器数据请求将发生的操作 我尝试在构造函数 ES6 实现 中分派操作 componentWillMount and c
  • java.lang.IllegalArgumentException:不能有 viewTypeCount < 1

    我收到此错误 java lang IllegalArgumentException Can t have a viewTypeCount lt 1 我很确定我确切地知道是什么原因造成的 但我不知道如何解决它 我的应用程序从数据库加载用户朋友
  • FormHelper::label 和 FormTagHelper::label_tag 有什么区别?

    我正在编写一个处理多个模型的表单 有关如何执行此操作的一些示例ActionView Helpers FormHelper 标签 还有一些使用ActionView Helpers FormTagHelper label tag 我真的不明白其
  • 如何在 Xcode 中的模拟器构建中排除框架

    当我编译应用程序以在模拟器上运行时 如何从 Xcode 项目中排除仅为 iOS 设备架构编译的库 libssh2 等 我知道这是一个老问题 但如果有人仍在寻找答案 您可以使用弱链接指定某些库是optional See 这个答案是关于如何在
  • 如何使用jquery将整个html页面放入div中?

    首先 我想让大家知道我是一个绝对的初学者 所以请耐心等待 我想知道如何将整个 html 页面放入 div 中 我试过 footballPlayers html footballplayers html 但它显示footballplayers
  • 我究竟做错了什么? Java 非法格式转换异常

    我有一些计算圆属性的代码 package circleinfo import java util Scanner public class Circleinfo public static void main String args Sca
  • “hg revert”后我的更改消失了吗?

    在我上次提交之后 我写了一堆代码 在再次提交之前 我跑了hg add 它添加了一些我不感兴趣的文件 所以我跑了 hg revert all 认为所有添加的文件都会消失 它们确实消失了 但我还恢复了自上次提交以来编写的所有代码 这意味着大量工
  • 我是否必须将令牌存储在 cookie、本地存储或会话中?

    我正在使用 React SPA Express Express session Passport 和 JWT 我对存储令牌的一些不同客户端存储选项感到困惑 Cookie Session 和 JWT Passport 令牌是否必须存储在 co
  • 如何在Python中获取两个时间对象之间的差异

    我在 Python 中有两个 datetime time 对象 例如 gt gt gt x datetime time 9 30 30 0 gt gt gt y datetime time 9 30 31 100000 但是 当我对 dat
  • 在 com.google.android.gms.measurement.internal 解除绑定时抛出异常

    我收到此异常 但我不知道如何找到问题所在 也不知道是什么原因导致的 你能帮我吗 W ConnectionTracker Exception thrown while unbinding java lang IllegalArgumentEx
  • perl6 插入数组以匹配 AND、OR、NOT 函数

    我正在尝试重新执行我的程序 以匹配数组中的所有项目 匹配任意项目 不匹配项目 Perl6 的一些文档没有解释当前实现的行为 Rakudo 2018 04 我还有几个问题 1 正则表达式的文档说将数组插入匹配正则表达式意味着 最长匹配 但是