我试图用空字符串替换字符串中的方括号。这意味着如果字符串是[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)
答案 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
必要时自动转义任何特殊字符),并将其替换为通过查找哈希值找到的值,或者只是在散列中找不到它时将其删除。