如何在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中做链式正则表达式?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>