我需要进行一系列替换,并将它们存储在哈希中。要替换的一个字符是句点(。),我在正则表达式中很难逃脱它。这是最低限度的重复:
#!/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'取代。我做错了什么?
答案 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]);