(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;
按预期输出为“真”.但我希望有一个更简单的方法,没有“聚集 – 采取”和“为”循环.
非常感谢您的任何见解.
lisprog
解决方法
interpolate array in match for AND,OR,NOT functions
我不知道任何比Moritz更好的解决方案对于AND.
我在下面覆盖OR.
编写匹配令牌列表的NOT的一种自然方式是使用lookahead或后向断言的否定版本,例如:
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)
这是字符串“123 ab 4567 cde”中12个不是23,b,cd或567匹配的位置,由下面的^ s行显示,它指向匹配的每个字符位置:
my $a="123 ab 4567 cde"; ^ ^^^ ^^ ^^^ ^^^ 0123456789012345
I am trying to re-do my program for match-all,match-any,match-none of the items in an array.
这些声音交汇点和你的其他一些问题显然都是关于路口的.如果您链接到现有程序,可能会让我/其他人更容易看到您要执行的操作.
(1)
|| @b匹配@b中最左边的匹配标记,而不是最长的匹配标记.
写| @b,用单个|来匹配@b中最长的匹配标记.或者,更好的是,只写简单的@b,这是同样的简写.
与任何其他匹配模式一样,这两种匹配模式(| @b或|| @b)都受正则表达式引擎工作方式的影响,正如Moritz简要描述并在下面更详细地描述的那样.
当正则表达式引擎匹配输入字符串的正则表达式时,它从正则表达式的开始和输入字符串的开始处开始.
如果它不匹配,它会跳过输入字符串中的第一个字符,放弃该字符,而是假装输入字符串从其第二个字符开始.然后它再次尝试匹配,从正则表达式的开头开始,但输入字符串的第二个字符.它会重复此操作,直到它到达字符串的末尾或找到匹配项.
举个例子,引擎无法在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或|| @b表示与正则表达式中的含义完全无关的内容.如您所见,| @b与@ b.Slip相同. || @b表示@ b.Slip.Slip,其值为@ b.Slip.
要做一个“并行”最长匹配模式 – 赢得@b元素的OR,在正则表达式中写@b(或| @b).
要做一个“顺序”最左边匹配模式赢得@b元素的OR,在正则表达式中写|| @b.
到目前为止,我还没弄清楚什么&和&&当用于在正则表达式中为数组添加前缀时.在我看来,有多个与其使用相关的错误.
在你问题的一些代码中,你已经指定了:g副词.这会引导引擎在找到匹配时不停止,而是跳过它刚匹配的子串,并开始尝试在输入字符串中再次匹配.
(还有其他副词.: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 / }