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

17

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

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

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

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

    
задан Ron 24.03.2012 в 00:02
источник

4 ответа

23

Вы неправильно поняли, как используются классы символов :

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

делает то же самое, что и ваше регулярное выражение (предполагается, что вы не хотели удалить ' символов из ваших строк).

Изменить: + позволяет нескольким из этих «специальных символов» совпадать сразу, поэтому он также должен быть быстрее.

    
ответ дан Tim Pietzcker 24.03.2012 в 00:05
источник
13

Вместо этого вы можете использовать tr:

       $p =~ tr/fo//d;

удалит все f и все o из $p . В вашем случае это должно быть:

       $p =~ tr/$#@~!&*()[];.,:?^ '\\///d
    
ответ дан ShinTakezou 24.03.2012 в 00:09
источник
6

С классом символов этот большой легче сказать, что вы хотите сохранить. Каретка в первой позиции класса символов инвертирует ее смысл, поэтому вы можете написать

$varTemp =~ s/[^"%'+\-0-9<=>a-z_{|}]+//gi

или, используя более эффективный tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd
    
ответ дан Borodin 24.03.2012 в 00:42
источник
0

Хорошо, если вы используете произвольно сгенерированную строку, так что она имеет низкую вероятность соответствия некоторой преднамеренной строке, которую вы обычно можете найти в данных, тогда вам, вероятно, понадобится одна строка для каждого файла.

Вы берете эту строку, назовите ее $place_older say. И затем, когда вы хотите удалить текст, вы вызываете quotemeta , и вы используете это значение для замены:

my $subs = quotemeta $place_holder;
s/$subs//g;
    
ответ дан Axeman 24.03.2012 в 00:10
источник