2010-12-16 72 views
3

我想要使用正则表达式和包含更改的哈希表更改一行。我使用下面的代码更改:无法识别的转义 m通过与PERL的正则表达式错误

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...",(删除\\)。

但我仍然想知道问题是什么,因为将来我可能需要添加其他可能导致问题的值。

回答

5

你有这样的问题,因为你的弦已经序列的正则表达式特殊对待。所以你需要逃避/引用这个序列。下面是Perl的所谓十二金刚

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

这将修复它(\Q..\E将引用这样的元字符):

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

它看起来像你遇到了问题,因为你使用字符串文字作为一个正则表达式,并在一个字符串中使用反斜杠比在正则表达式中使用反斜杠不同的解释。

使用qr运算符(http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators),可以通过在您的散列中存储正则表达式而不是字符串文字来解决此问题。

+0

QR并不在这里帮助,它改变了它所被赋予成别的东西。它添加和更改,以便它将以正则表达式语言。 – SIMEL 2010-12-16 14:57:04

+0

由于有问题的字符位于散列_keys_中,因此qr不会起作用,因为散列键只能是字符串。 – cjm 2010-12-16 19:23:32

0
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"; 
相关问题