Почему приведенный ниже код не работает должным образом? - PullRequest
0 голосов
/ 27 июня 2018

Ниже приведен код, соответствующий определенному ключевому слову из файла. Обратите внимание, что в этом файле есть определенное ключевое слово. (Подтверждено)

#!/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

1 Ответ

0 голосов
/ 27 июня 2018

Вы намереваетесь интерпретировать $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/;

Или вы можете оставить это как строку, но поместить в синтаксис регулярного выражения (требуется дополнительное удвоение двойной обратной косой черты, очень уродливо):

my $tempStr='=\?UTF-8\?B\?U2Now4PCtm5l\?=\\\\, Ma';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...