Лучший способ удалить определенные символы из строки Perl
У меня есть динамически сгенерированные строки типа @#@[email protected]!#!
, и я хочу удалить определенные символы из строки с помощью Perl.
В настоящее время я делаю что-то такое (заменяя символы ничем):
$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g;
Есть ли лучший способ сделать это? Я боюсь за что-то чистое.
Ответы
Ответ 1
Вы неправильно поняли, как классы символов:
$varTemp =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g;
делает то же самое, что и ваше регулярное выражение (предполагается, что вы не хотели удалять символы '
из ваших строк).
Изменить: +
позволяет нескольким из этих "специальных символов" совпадать сразу, поэтому он также должен быть быстрее.
Ответ 2
Вместо этого вы можете использовать tr:
$p =~ tr/fo//d;
удалит все f и все o из $p
. В вашем случае это должно быть:
$p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d
Ответ 3
С классом символов этот большой легче сказать, что вы хотите сохранить. Каретка в первой позиции класса символов инвертирует ее смысл, поэтому вы можете написать
$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi
или, используя более эффективный tr
$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
Ответ 4
Хорошо, если вы используете произвольно сгенерированную строку, так что она имеет низкую вероятность соответствия некоторой преднамеренной строке, которую вы обычно можете найти в данных, тогда вам, вероятно, понадобится одна строка для каждого файла.
Вы берете эту строку, назовите ее $place_older
say. И затем, когда вы хотите удалить текст, вы вызываете quotemeta
, и вы используете это значение для замены:
my $subs = quotemeta $place_holder;
s/$subs//g;