如何在 Perl 中做链式正则表达式?

How to do chained regex in Perl?

我很高兴得知 Perl 可以在 5.32 版本中处理链式比较

但是,我正在尝试进行链式正则表达式比较以使我的代码更短更清晰

#!/usr/bin/env perl

use 5.032;
use strict;
use warnings FATAL => 'all';
use feature 'say';
use autodie ':all';

if (9 > 2 < 3 < 4 > 0) {
    say 'chained expressions work.'
} else {
    say 'chained expressions do not work.'
}

my $x = 4;
my $z = 4;

if ($x == 4 == $z) {
    say 'chained equality works';
}

$x = 'x';
$z = 'x';

if ($x eq 'x' eq $z) {
    say 'chained string comparisons work.';
}

$x = '.';
$z = './.';
if ($x =~ m/\./ =~ $z) { # unfortunately this doesn't work
# equivalent of `if ( ($x =~ m/\./) && ($z =~ m/\./)) {
    say 'chained regex works.';
} else {
    say 'no chained regex.'; 
}

如何正确地使用正则表达式进行链式比较?

虽然 100 <= $x < 200 具有明显的含义,但 A =~ B =~ C 却没有。哪些操作数应该是字符串?其中哪些应该是匹配运算符?应该进行什么操作?

您建议在最后一个 =~ 的 RHS 上放置一个字符串以匹配它,但这根本不是 =~ 的工作方式;字符串总是在 LHS 上。 $s =~ /a/ =~ /b/ 可能是有道理的,但这样做的效果仍然不明显,尤其是在有捕获的情况下。因此,这不受支持。

如果您想链接一些匹配项,可以使用以下选项:

all { $s =~ $_ } qr/a/, qr/b/

any { $s =~ $_ } qr/a/, qr/b/

none { $s =~ $_ } qr/a/, qr/b/

notall { $s =~ $_ } qr/a/, qr/b/

all { /a/ } $s1, $s2

any { /a/ } $s1, $s2

none { /a/ } $s1, $s2

notall { /a/ } $s1, $s2

核心模块提供的这些功能List::Util

请注意,Perl 的“链接”更像是一个宏(个人而言,我认为基本上重新排列代码的“语法”功能是大危险信号):

$x OP1 $y OP2 $z

这实际上被重写为如下内容(考虑了一些其他细节,但此处不重要):

$x OP1 $y and $y OP2 $z

这仅适用于某些运算符——进行比较的运算符。

考虑一下这个宏如果起作用的话会对此做些什么:

$x =~ m/\./ =~ $z

此转换为您提供:

$x =~ m/\./ and m/\./ =~ $z

也就是中间的东西第一次操作在右边,第二次在左边。 $x 将绑定到匹配运算符,然后匹配运算符的结果将绑定到 $z,我猜这必须是预编译模式。

ikegami 已经表明你实际上并没有链接东西。您想连续测试一些东西。


我通常反对这个特性,但它在没有经过实验周期的情况下立即被引入 Perl。在一个related Github issue I raised, people went back and forth in the thinking about it (but note the number of reactions to my comment that this would confuse people is quite high, but effectively ignored). In the Perl 5 Thread中,有些人认为人们会感到困惑,而有些人认为这是不可能的。第二组获胜

直到写完 Chain comparisons to avoid excessive typing, and the first comment on Reddit 之后,我才感到困惑或反对。

但是我们到了。

我的建议是不要使用链式比较。即使文档是正确的,该功能也会让普通用户感到困惑。它不像他们想要的那样行事。人们倾向于根据他们所知道的其他事情来猜测一种编程语言将做什么。他们不是仅仅检查每个案例,而是凭直觉(有时是错误的)判断某事将或应该如何行动。