是否有Perl函数将字符串转换为正则表达式以将该字符串用作模式?

时间:2008-10-15 12:08:23

标签: regex perl string

我在使用Perl grep()时遇到的问题是可能包含被解释为正则表达式量词的字符串。

当grep模式为“g ++”时出现以下错误,因为'+'符号 被解释为量词。以下是程序的输出:

1..3
ok 1 - grep, pattern not found
ok 2 - grep, pattern found

Nested quantifiers in regex; marked by <-- HERE
in m/g++ <-- HERE / at escape_regexp_quantifier.pl line 8.

我是否可以用一个修饰符来表示grep应该忽略量词, 还是有一个能逃脱量词的函数?

#! /usr/bin/perl 

sub test_grep($)
{
    my $filter = shift;
    my @output = ("-r-xr-xr-x   3 root     bin       122260 Jan 23  2005 gcc",
                  "-r-xr-xr-x   4 root     bin       124844 Jan 23  2005 g++");
    return grep (!/$filter/, @output);
}

use Test::Simple tests => 2;

ok(test_grep("foo"), "grep, pattern not found");
ok(test_grep("gcc"), "grep, pattern found");
ok(test_grep("g++"), "grep, pattern found");

PS:除了上面的答案问题,我欢迎任何有关Perl用法的反馈,因为我还在学习。感谢

5 个答案:

答案 0 :(得分:27)

标准方法是在变量前使用\Q转义指示符,告诉Perl不要将内容解析为正则表达式:

return grep (!/\Q$filter/, @output);

更改代码中的那一行会产生:

1..3
ok 1 - grep, pattern not found
ok 2 - grep, pattern found
ok 3 - grep, pattern found

答案 1 :(得分:15)

我认为您正在寻找quotemeta

答案 2 :(得分:8)

除了上面的答案问题,我欢迎任何有关Perl用法的反馈,因为我还在学习。感谢

我建议你不要使用原型(test_grep之后的($))。它们有它们的用途,但在大多数情况下都没有,绝对不是在这个中。

答案 3 :(得分:2)

  PS:除了答案问题   以上,我欢迎任何关于Perl的反馈   我仍在使用上面的用法   学习。

我可以为Perl编码建议提供的最佳建议是安装Perl::Critic并在代码上使用perlcritic命令。如果您不能这样做,可以使用on-line perl critic tool。如果您有Perl Best Practices的副本,这将有所帮助,因为Perl::Critic已经阅读了本书,并且会为您提供页码的参考,但即使您没有书,但仍然可以从Perl::Critic::Policy::开始的Perl::Critic documentation部分中查找扩展反馈。

答案 4 :(得分:2)

我建议在这种情况下使用qr创建Regexp对象而不是字符串。

ok(test_grep(qr/foo/), "grep, pattern not found");
ok(test_grep(qr/gcc/), "grep, pattern found");
ok(test_grep(qr/g\+\+/), "grep, pattern found");

然后你不需要\ Q逃脱。虽然你仍然可以使用它:

ok(test_grep(qr/\Qg++/), "grep, pattern found");