我正在尝试在运行时构造一个小的正则表达式,但不知何故它从不匹配 - 我做错了什么?
my $word = quotemeta("test");
my $lines = "just a test to testing find tester testönig something fastest out pentest";
my $rule = "m/" . $word . "/g";
my $regex = qr/$rule/;
while ($lines =~ $regex) {
# this never happens...
print "\nFound pattern: '$&'";
}
答案 0 :(得分:1)
这可能是你想要的:
#!/usr/bin/perl
use strict;
use warnings;
my $word = quotemeta("test");
my $lines = "just a test to testing find tester testönig something fastest out pentest";
my $regex = qr/$word/;
while ($lines =~ /$regex/g) {
print "\nFound pattern: '$&'";
}
您不能将/g
直接用于qr
。
答案 1 :(得分:1)
您的代码:
my $word = quotemeta("test");
my $rule = "m/" . $word . "/g";
my $regex = qr/$rule/;
与此相同:
my $word = quotemeta("test");
my $rule = "m/test/g"; # interpolated $word
my $regex = qr~m/test/g~; # interpolated $rule
也就是说,它匹配文字字符串" m/test/g
"没有别的。
buff已经提供了与我建议的代码相同的代码,但我建议避免使用$&
,因为perlvar中提到的性能损失:
在程序中的任何位置使用此变量都会产生相当大的影响 所有正则表达式匹配的性能损失。为了避免这种情况 惩罚,您可以使用
@-
提取相同的子字符串。从...开始 在Perl v5.10.0中,您可以使用/p
匹配标志和${^MATCH}
变量 为特定的匹配操作做同样的事情。