首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么下面的代码没有像预期的那样工作?

为什么下面的代码没有像预期的那样工作?
EN

Stack Overflow用户
提问于 2018-06-27 21:28:19
回答 1查看 58关注 0票数 0

我有下面的代码来匹配文件中的特定关键字,请注意,该文件中存在特定的关键字。(已验证)

代码语言:javascript
复制
#!/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";

我从文件中附加了几行以供澄清。

代码语言:javascript
复制
# Step: 23    14:48:52
#  
# var: expect-count='1'
# var: msg-rx=""=?UTF-8?B?U2Now4PCtm5l?=\, Maik ""
# etc etc etc
EN

回答 1

Stack Overflow用户

发布于 2018-06-27 21:49:41

您是否打算将$tempStr解释为正则表达式?如果是这样,那么您应该知道?是一个正则表达式运算符,不会在字面上匹配目标字符串中的?

此外,它在Ma之后有一个空格,但您的示例文件具有Maik,因此该部分不匹配。

这些更改将产生不同的结果:

代码语言:javascript
复制
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成为真正的正则表达式:

代码语言:javascript
复制
my $tempStr=qr/=\?UTF-8\?B\?U2Now4PCtm5l\?=\\, Ma/;

或者,您可以将其保留为字符串,但将其放入regexp语法中(需要额外的双反斜杠,非常难看):

代码语言:javascript
复制
my $tempStr='=\?UTF-8\?B\?U2Now4PCtm5l\?=\\\\, Ma';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51064060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档