2012-03-23 28 views
17

@#@[email protected]!#! gibi dinamik olarak oluşturulmuş dizeler var ve Perl kullanarak dizeden belirli karakterleri kaldırmak istiyorum.Belirli karakterleri Perl dizesinden kaldırmanın daha iyi yolu

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

Bunu yapmanın daha iyi bir yolu var mı:

Şu anda bir şey bu (hiçbir şey karakterler yerine) yapıyorum? Temiz bir şey için fondeyim.

cevap

23

Sen character classes nasıl kullanıldığı yanlış anlaşılan ettik:

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

(Eğer dizeleri ' karakterleri kaldırmak istemedim varsayarak) regex olarak aynısını yapar.

Düzenleme: +, bu "özel karakterlerin" birkaçının aynı anda eşleşmesine izin verir, bu nedenle daha hızlı olması gerekir.

13

yerine tr kullanabilirsiniz:

 $p =~ tr/fo//d; 

her f ve $p her o silecektir. Senin durumunda bu olmalıdır: Eh

 $p =~ tr/\$#@~!&*()[];.,:?^ `\\\///d 
0

o normalde verilerde bulabileceğiniz bazı kasıtlı dize uyumlu olmadan düşük olasılığa sahiptir, böylece rastgele oluşturulmuş bir dize kullanıyorsanız, o zaman muhtemelen dosya başına bir dize ister.

Bu dizeyi alırsanız, $place_older deyin. Metni ortadan kaldırmak istediğinizde Ve sonra, quotemeta çağrısı ve yerine bu değeri kullanın:

my $subs = quotemeta $place_holder; 
s/$subs//g; 
+0

Bu olmayan tüm kelime karakterlerini kullanılan karakterler kullanmakta,

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

yazmak veya böylece bir karakter sınıfının birinci konumda bir şapka, onun duygusunu tersine çevirir. Bu sadece belirli bir karakter kümesini kaldırmak istediğimde işe yaramaz. – Ron

6

hesapta tutmak istediğini söylemek daha kolaydır bu kadar büyük bir karakter sınıfıyla. Eğer daha verimli tr

$varTemp =~ tr/"%'+\-0-9<=>A-Z_a-z{|}//cd 
İlgili konular