2012-02-09 12 views
5
Verilen

...Perl'de, bir karakter kümesini tek bir geçişte farklı karakter kümeleriyle nasıl değiştirebilirim? ~ Ve x karakterleri -

Ax~B~xCx~xDx 

... yayarlar ...

A~-B-~C~-~D~ 

Birlikte ~ karakterleri değiştirmek istiyorum. İki kez dize üzerinden geçerek

ben yazabilirim ...

s/~/-/g;s/x/~/g; 

... ama bu (gibi görünüyor).

+0

Neden RegEx kullanıyorsunuz? Neden sadece ipin üzerinden kendini tekrarlamıyorsun? –

+0

Çünkü bu ... ... PEEEEEEEEEERL !!!! Nah daha ciddiye, regeeksler tüm şeyleri yazmak zorunda kalmadan daha kısa ve daha hızlıdır. – m0skit0

+1

@CoreyOgburn Çünkü dizenin üzerinde yineleme yaparsam perlde C (veya FORTRAN?) Yazıyorum ve amaç perl yazmak. –

cevap

14

Karakterlere göre değiştirmek için "transliterate" kullanın. Bu deneyin:

tr/~x/\-~/; 
+5

"transliterate", "tercüme" değil –

+5

Köşeli parantezler gereksizdir ve burada işe yaramaz. – Sean

+0

Muhtemelen haklısınız, ama [yanlış öğretildim] (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#DoingTranslations). – m0skit0

2

Eğer tek karakterler ile uğraşıyoruz yana, tr /// bariz cevap: Ancak

tr/~x/-~/; 

, sen s /// başa ihtiyacımız olacak uzun diziler:

my %subs = ('~' => '-', 'x' => '~'); 
my $pat = join '|', map quotemeta, keys %subs; 
s/($pat)/$subs{$1}/g; 
İlgili konular