Нераспознанный escape \ m прошел через ошибку регулярного выражения с PERL - PullRequest
3 голосов
/ 16 декабря 2010

Я пытаюсь изменить строку, используя Regex и хеш-таблицу, содержащую изменения.Я использую следующий код для изменения:

    foreach $key (keys %{$hash{$sub_hash}}){
        $line =~ s/$key/$hash{$csub_hash}{$key}/g;
    }

И мой хеш-код:

    $hash{sub_hush_a}={
    "\\mi2ie..."    =>  "\\RSUop...",
    "iereset..."    =>  "\\agres...",
};

Проблема заключается в том, что для первой пары в наборе данных, когда он меняетсяон ставит \\ вместо \, а для второго - только один, как и ожидалось.

Также выдает ошибку: Unrecognized escape \m passed through.Что не так?

уточнение : точек в именах нет в программе, имена длиннее, чем я положил, и все они содержат только буквы и цифры.точки здесь для того, чтобы сократить.

РЕДАКТИРОВАТЬ:

Проблема исправляется, (двойной \ и сообщение об ошибке), если я меняю кулак парына:

"mi2ie..." => "RSUop...", (удалите \\).

Но я все еще хочу знать, в чем проблема, поскольку в будущем мне может понадобиться добавить другие значения, которые могут вызватьпроблема.

Ответы [ 3 ]

6 голосов
/ 16 декабря 2010

У вас есть эта проблема, потому что ваши строки имеют последовательности, которые рассматриваются как специальные в регулярном выражении . Таким образом, вы должны избежать / процитировать эту последовательность. Вот так называется Perl Dirty Dozen :

\ | () [{^ $ * +? .

Это исправит это (\Q..\E будет указывать такие метасимволы):

foreach $key (keys %{$hash{$sub_hash}}){
    $line =~ s/\Q$key\E/$hash{$csub_hash}{$key}/g;
}
0 голосов
/ 16 декабря 2010
my $line = 'test\mi2ie...test';

sub replace($$$) {
   my ($str, $what, $replacement) = @_;
   my $pattern = quotemeta($what);
   $str =~ s/$pattern/$replacement/g;
   return $str;
}

my %hash;
my $sub_hash = "test";
$hash{$sub_hash} = {
    '\mi2ie...'    =>  '\RSUop...',
    'iereset...'    =>  '\agres...',
};

while (my ($key, $value) = each %{$hash{$sub_hash}}) {
    $line = replace($line, $key, $value);
}

print "$line\n";
0 голосов
/ 16 декабря 2010

Похоже, у вас возникли проблемы, потому что вы используете строковые литералы в качестве регулярного выражения, а обратные слеши в строковом литерале интерпретируются иначе, чем использование обратных косых черт в регулярном выражении.

Вы можете обойти это, сохранив регулярные выражения в хэше вместо строковых литералов, используя оператор qr (http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...