逃避'。'在动态计算的正则表达式中

时间:2014-02-20 05:33:09

标签: perl

我需要进行一系列替换,并将它们存储在哈希中。要替换的一个字符是句点(。),我在正则表达式中很难逃脱它。这是最低限度的重复:

#!/usr/bin/perl -w

my %map = ( ';', '1', '\.', '2', );
my $pattern = join('|', sort keys %map);

while (<>) {
    while (s/($pattern)/$map{$1}/) {}
    print;
}

MBA:/Users/ambarish/> ./test.pl 
foo;
foo1
foo.
Use of uninitialized value within %map in substitution iterator at ./test.pl line 7, <> line 4.
foo

逃避它两次('\。')没有帮助,并且三次逃避它会使错误消失,但是'。'不会被'2'取代。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可以使用quotemeta来处理转义:

my %map = ( ";" => 1, "." => 2 );
my $pattern = join('|', map quotemeta, sort keys %map);

此外,您不能将转义期间用作哈希键,并尝试使用未转义的句点查找它。哈希键将包含反斜杠,如下所示:

> perl -lwe"%a=('\.',1); use Data::Dumper; print Dumper \%a"
$VAR1 = {
          '\\.' => 1
        };

此外,当然,如果您使用单个字符,则可以使用字符类[;.]而不是替换|。这可以使用qr()函数动态生成:

my $pattern = join "", sort keys %map;
$pattern = qr([$pattern]);