Подтвердить что ты не робот

Лучший способ удалить определенные символы из строки Perl

У меня есть динамически сгенерированные строки типа @#@[email protected]!#!, и я хочу удалить определенные символы из строки с помощью Perl.

В настоящее время я делаю что-то такое (заменяя символы ничем):

$varTemp =~ s/['\$','\#','\@','\~','\!','\&','\*','\(','\)','\[','\]','\;','\.','\,','\:','\?','\^',' ', '\`','\\','\/']//g;

Есть ли лучший способ сделать это? Я боюсь за что-то чистое.

4b9b3361

Ответ 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;