regex - 如何在 Perl 中进行链式正则表达式?

标签 regex 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提供的这些功能.

关于regex - 如何在 Perl 中进行链式正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65816094/

相关文章:

javascript - 为什么以下 if 语句排除与其余数组相同的数组?

python - 如何使用正则表达式 python 部分搜索单词

c# - 文本解析和拆分文本,包括/不包括引号

c - 使用 perl 更新 C 文件中的宏

perl - 无法使用 WSDL::Generator 运行 Perl Web 服务

perl - 如何在 Perl 中修改二进制标量的特定部分?

javascript - 使用 exec 测试有效的邮件地址

python - 在字符串中查找数字,修改并重新加入

perl - 为什么是 Perl 的 $?为 fork 进程的退出代码返回错误的值?

Python的Perl程序员