在Perl中,如何在一次操作中将一组字符替换为另一组字符?

5

Given ...

Ax~B~xCx~xDx

...发出...

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

我想用-代替~字符,用~代替x字符。

我可以这样写...

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

...但这个过程(看起来)会对字符串进行两次操作。


为什么要使用正则表达式?为什么不自己迭代字符串? - Corey Ogburn
因为这是Perl!开个玩笑,正则表达式比写整个东西要短得多且更快。 - m0skit0
1
因为如果我自己迭代字符串,那么我就是在 Perl 中写 C(或 FORTRAN?),而目标是要写 Perl。 - Thomas L Holaday
正则表达式绝对不是这项工作的正确工具,tr/// 才是。 - tadmc
2个回答

14

使用“transliterate”来基于字符进行替换。尝试这个:

tr/~x/\-~/;

5
“transliterate” 不是“翻译”,它指的是将一种文字音译成另一种文字,并保留原文的发音和语调,而不是直接翻译其意思。 - evil otto
5
方括号在这里是不必要且无用的。 - Sean
你可能是对的,但是我被教错了 - m0skit0
7
tr/~x/-~/ 就是您要查找的内容。您的音译没有使用正则表达式元字符,而是将它们视为字符串文字,用 [ 替换 [,用 , 替换 ,,以此类推。 - TLP

2

由于您正在处理单个字符,因此tr///是显而易见的答案:

tr/~x/-~/;

然而,如果你需要处理更长的序列,你将需要使用s///。
my %subs = ( '~' => '-', 'x' => '~' );
my $pat = join '|', map quotemeta, keys %subs;
s/($pat)/$subs{$1}/g;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接