我有动态生成的字符串,如@#@!efq@!#!
,我想使用Perl从字符串中删除特定字符。
目前我正在做一些事情(用什么都不替换字符):
$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g;
有更好的方法吗?我正在寻找干净的东西。
答案 0 :(得分:24)
您误解了character classes的使用方式:
$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g;
与正则表达式相同(假设您不是要从字符串中删除'
个字符)。
编辑:+
允许一些“特殊字符”同时匹配,因此它也应该更快。
答案 1 :(得分:17)
您可以改用tr:
$p =~ tr/fo//d;
将从$p
中删除每个f和每个o。在你的情况下应该是:
$p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d
答案 2 :(得分:7)
对于这么大的角色类,更容易说出你想要保留的内容。字符类第一个位置的插入符反转其意义,因此您可以编写
$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi
或使用效率更高的tr
$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
答案 3 :(得分:0)
如果您正在使用随机生成的字符串,以便它很可能与您通常在数据中找到的某些有意字符串匹配,那么您可能希望每个文件有一个字符串。
你接受那个字符串,称之为$place_older
。然后,当您想要删除文本时,请调用quotemeta
,然后使用该值替换:
my $subs = quotemeta $place_holder;
s/$subs//g;