2012-02-09 40 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; 
相关问题