regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?

标签 regex perl

假设我有一个子程序/方法,用户可以调用它来测试一些数据(例如)可能如下所示:

sub test_output {
    my ($self, $test) = @_;
    my $output = $self->long_process_to_get_data();
    if ($output =~ /\Q$test/) {
        $self->assert_something();
    }
    else {
        $self->do_something_else();
    }
}

通常情况下,$test是一个字符串,我们在输出中的任何地方寻找它。这是一个组合在一起的界面,使调用变得非常容易。但是,我们发现有时,直字符串是有问题的——例如,大量的、可能不同数量的空格……如果你愿意的话,这是一种模式。因此,我想让他们作为选项传入正则表达式。我可以这样做:
$output =~ $test

如果我可以假设它总是一个正则表达式,但是啊,但是向后兼容!如果他们传入一个字符串,它仍然需要像原始字符串一样对其进行测试。

所以在那种情况下,我需要测试看看是否 $test是一个正则表达式。是否有任何好的工具来检测标量中是否包含已编译的正则表达式?

最佳答案

hobbs points out ,如果您确定您将使用 5.10 或更高版本,则可以使用内置检查:

 use 5.010;
 use re qw(is_regexp);
 if (is_regexp($pattern)) {
     say "It's a regex";
 } else {
     say "Not a regex";
 }

但是,我并不总是有这样的选择。通常,我通过使用 ref 检查原型(prototype)值来做到这一点。 :
 if( ref $scalar eq ref qr// ) { ... }

我开始这样做的原因之一是我永远记不起正则表达式引用的类型名称。我现在也想不起来了。它也不像其他的那样大写,因为它实际上是在 perl 源代码中实现的包之一(如果你想看的话,在 regcomp.c 中)。

如果你必须做很多事情,你可以使用你最喜欢的常量创建器使原型(prototype)值成为常量:
 use constant REGEX_TYPE => ref qr//;

我在 Effective Perl Programming 中详细讨论了这个问题。如“第 59 项:将值与原型(prototype)进行比较”。

如果你想尝试两种方式,你可以在 perl 上使用版本检查:
 if( $] < 5.010 ) { warn "upgrade now!\n"; ... do it my way ... }
 else             { ... use is_regex ... }

关于regex - 如何使用 Perl 检查标量中是否包含已编译的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2563351/

相关文章:

Python 正则表达式 2 或 1 个字符串中的语句

java - 正则表达式:匹配没有初始零且没有最后两个零的字符串

regex - 我的正则表达式匹配太多。我该如何让它停止?

regex - 解析mysql :///sqlite:///URLs

Python:在多个 CSS 选择器的复杂列表上使用正则表达式来提取它们的 # 和 .标签

xml - 如何使用 Perl 查找和替换 XML 中的文本?

html - Mojolicious 响应的基本 URL

xml - 如何使用 XML::LibXML 列出 XML 节点属性?

perl - 命令行枢轴

python - 将两行中的值附加到 key 对中