Perl 转义'';在动态计算的正则表达式中

Perl 转义'';在动态计算的正则表达式中,perl,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

我需要进行一系列替换,并将它们存储在散列中。要替换的字符之一是句号(.),我在正则表达式中很难摆脱它。这里有一个最低要求:

#!/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
#/usr/bin/perl-w
我的%map=(';','1','\','2',);
my$pattern=join(“|”,排序键%map);
而(){
而(s/($pattern)/$map{$1}/){}
印刷品;
}
MBA:/Users/ambarish/>./test.pl
傅;
foo1
福。
在./test.pl第7行第4行的替换迭代器中使用%map中的未初始化值。
福

转义两次(“\”)没有帮助,转义三次会使错误消失,但是“.”不会被“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]);