使用PERL时出现“未识别的转义\m”错误。

3

我正在尝试使用正则表达式和包含更改的哈希表来更改一行。 我正在使用以下代码进行更改:

    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个回答

7
你遇到了这个问题是因为正则表达式中将一些字符序列视为特殊字符。所以你需要转义/引用这些字符序列。这里是Perl的所谓Dirty Dozen

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

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

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

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";

0

看起来你遇到了问题,因为你正在使用字符串字面量作为正则表达式,并且在字符串字面量中使用反斜杠与在正则表达式中使用反斜杠的含义不同。

你可以通过将正则表达式存储在哈希表中而不是字符串字面量中来解决这个问题,使用qr运算符(http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators)。


qr在这里没有帮助,它会将给定的内容转换为其他内容。它添加和更改以便符合正则表达式语言。 - SIMEL
由于不良字符位于哈希键中,qr 无法提供帮助,因为哈希键只能是字符串。 - cjm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接