我在使用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用法的反馈,因为我还在学习。感谢
答案 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");