2012-02-09 7 views
5

...W Perlu, w jaki sposób mogę zamienić zestaw znaków na inny zestaw znaków w pojedynczym przejściu? Biorąc

Ax~B~xCx~xDx 

... emitować ...

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

Chcę wymienić ~ znaków z - a x znaków z ~.

mogę napisać ...

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

... ale to (wygląda na to) przechodzi nad ciągiem dwukrotnie.

+0

Dlaczego warto korzystać z RegEx? Dlaczego samemu nie powtórzyć ciągu? –

+0

Ponieważ to ... jest ... PEEEEEEEEEERL !!!! Nah bardziej poważnie, regexes są znacznie krótsze i szybsze niż pisanie całego materiału. – m0skit0

+1

@CoreyOgburn Ponieważ jeśli IE iteracji ciągu ciągu siebie, piszę C (lub FORTRAN?) W perlu, a celem jest napisanie perl. –

Odpowiedz

14

Użyj "transliterate" do zastąpienia w oparciu o znaki. Spróbuj tego:

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

"transliterat", a nie "tłumaczyć" –

+5

Nawiasy kwadratowe są tu niepotrzebne i bezużyteczne. – Sean

+0

Prawdopodobnie masz rację, ale [źle mnie nauczono] (http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#DoingTranslations). – m0skit0

2

Ponieważ masz do czynienia z pojedynczymi znakami, tr /// jest oczywista odpowiedź:

tr/~x/-~/; 

jednak będziesz potrzebować s /// do czynienia z dłuższe sekwencje:

my %subs = ('~' => '-', 'x' => '~'); 
my $pat = join '|', map quotemeta, keys %subs; 
s/($pat)/$subs{$1}/g; 
Powiązane problemy