无法通过子例程通过正则表达式替换字符串

时间:2013-12-15 17:20:05

标签: regex string perl replace subroutine

我试图用空字符串替换字符串中的方括号。这意味着如果字符串是[SECTION],我想将其转换为SECTION

我试过这个并且有效,

my $sectionName =~ tr/[]//d;
print "$sectionName\n";

但是,当我尝试创建一个替换字符串的通用子例程时,它没有用完。这是我试过的,

sub strReplace
{
    my $string = shift;
    my $target = shift;     
    my $replacement = shift;

    $target = quotemeta $target;
    $replacement = quotemeta $replacement;

    $string =~ tr/$target/$replacement/d;

    return $string;
}

我正在调用这个子,

# the string "[SECTION]" below is intended to be replaced by a variable
my $sectionName = strReplace("[SECTION]", "[]", "");
print "$sectionName\n";

然而,我没有得到被替换的字符串,而是仍然使用旧字符串,即[SECTION]。我究竟做错了什么? (PS:Perl版本5.14.2)

2 个答案:

答案 0 :(得分:4)

Perl的tr///运算符不支持变量。您可以在此处找到解决此问题的各种策略:Perl's tr/// is not doing what I want

总而言之,您有两个主要选择:

  • 将您的tr///包裹在评估中。
  • 使用tr///将您的s///转换为替换。

答案 1 :(得分:1)

如果strReplace的主要情况实际上只是删除字符,那么我会编写一个不那么通用的子目录。否则,可以删除和替换的s///转换如下所示:

sub strReplace
{
    my $string = shift;
    my $target = shift;
    my $replacement = shift;

    my %replacement;
    @replacement{ split //, $target } = split //, $replacement;

    $string =~ s{ ([\Q$target\E]) }{ $replacement{$1} // '' }gxe;

    return $string;
}

重复替换(因为/ g标志)查找[\Q$target\E]($ target中任何字符的类中的字符,\Q...\E必要时自动转义任何特殊字符),并将其替换为通过查找哈希值找到的值,或者只是在散列中找不到它时将其删除。