我有以下代码来匹配文件中的特定关键字,请注意,该文件中存在特定关键字。 (已验证)
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $fname="sample.txt";
my @o_msg_rx;
my $tempStr='=?UTF-8?B?U2Now4PCtm5l?=\, Ma ';
push @o_msg_rx, $tempStr;
foreach my $rx_temp (@o_msg_rx) {
print "rx_temp = $rx_temp\n";
}
my @msg_arr;
open MM, '<', $fname;
chomp(@msg_arr = (<MM>));
close MM;
my (%o_msg_rx, %msg_anti_rx);
foreach my $rx (@o_msg_rx){
($rx =~ s/^!// ? $msg_anti_rx{$rx} : $o_msg_rx{$rx}) = 0 if $rx;
print "rx = \t$rx\n";
print "o_msg_rx_rx = \t$o_msg_rx{$rx}\n";
}
if(@msg_arr) {
foreach my $rx (keys %o_msg_rx) {
$o_msg_rx{$rx} = 1 if grep (/$rx/i, @msg_arr);
}
}
my $regex_ok = (! scalar grep (! $o_msg_rx{$_}, keys %o_msg_rx));
print "regex_ok = $regex_ok\n";
我将在文件中附加几行以进行澄清。
# Step: 23 14:48:52
#
# var: expect-count='1'
# var: msg-rx=""=?UTF-8?B?U2Now4PCtm5l?=\, Maik ""
# etc etc etc
答案 0 :(得分:2)
您是否打算将$tempStr
解释为正则表达式?如果是这样,那么您应该知道?
是一个正则表达式运算符,并且在字面上不匹配目标字符串中的?
。
此外,它在Ma
之后有一个空格,但是您的示例文件中有Maik
,因此该部分将不匹配。
这些更改将产生不同的结果:
my $tempStr='=?UTF-8?B?U2Now4PCtm5l?=\, Ma'; # remove the extra space
grep (/\Q$rx/i, @msg_arr); # Add \Q to match the literal string $tempStr in regexp
或者您可以从一开始就使$tempStr
成为真正的正则表达式:
my $tempStr=qr/=\?UTF-8\?B\?U2Now4PCtm5l\?=\\, Ma/;
或者您可以将其保留为字符串,但是将其放在regexp语法中(需要将双反斜杠额外加倍,非常难看):
my $tempStr='=\?UTF-8\?B\?U2Now4PCtm5l\?=\\\\, Ma';