2012-02-09 47 views
5

鑑於...在Perl中,如何在一次傳遞中用一組不同的字符替換一組字符?

Ax~B~xCx~xDx 

... ... EMIT

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

我要替換的字符〜 - 並與x個字〜。

我可以寫...

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

...但是,(貌似)經過串的兩倍。

+0

爲什麼要使用RegEx?爲什麼不直接迭代字符串呢? – 2012-02-09 19:51:20

+0

因爲這是...... PEEEEEEEEEERL !!!!比較嚴肅的是,正則表達式比編寫整個東西的方式更短更快。 – m0skit0 2012-02-09 19:52:06

+1

@CoreyOgburn因爲如果我自己迭代字符串,我在Perl中寫C(或FORTRAN?),目標是編寫perl。 – 2012-02-09 20:20:43

回答

14

使用「音譯」進行基於字符的替換。試試這個:既然你處理單個字符

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

「音譯」,而不是「翻譯」 – 2012-02-09 19:57:22

+5

方括號在這裏不需要和無用。 – Sean 2012-02-09 19:58:46

+0

你可能是對的,但[我被教錯了](http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#DoingTranslations)。 – m0skit0 2012-02-09 19:58:58

2

,TR ///是顯而易見的答案:

tr/~x/-~/; 

然而,你將需要小號///處理更長的序列:

my %subs = ('~' => '-', 'x' => '~'); 
my $pat = join '|', map quotemeta, keys %subs; 
s/($pat)/$subs{$1}/g; 
相關問題