在perl中,如何在一次传递中将一组字符替换为另一组字符?

在perl中,如何在一次传递中将一组字符替换为另一组字符?,perl,Perl,鉴于 Ax~B~xCx~xDx 。。。发射 A~-B-~C~-~D~ 我想用-替换~个字符,用~替换x个字符 我可以写 s/~/-/g;s/x/~/g; 。。。但这(看起来)会在字符串上传递两次。使用“音译”替换字符。试试这个: tr/~x/\-~/; 因为您处理的是单个字符,所以tr///是显而易见的答案: tr/~x/-~/; 但是,您需要s///来处理较长的序列: my %subs = ( '~' => '-', 'x' => '~' ); my $pat = jo

鉴于

Ax~B~xCx~xDx
。。。发射

A~-B-~C~-~D~
我想用-替换~个字符,用~替换x个字符

我可以写

s/~/-/g;s/x/~/g; 
。。。但这(看起来)会在字符串上传递两次。

使用“音译”替换字符。试试这个:

tr/~x/\-~/;

因为您处理的是单个字符,所以tr///是显而易见的答案:

tr/~x/-~/;
但是,您需要s///来处理较长的序列:

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

为什么要使用正则表达式?为什么不自己迭代字符串呢?因为这。。。是Peeeeeeell!!!!不,更严重的是,正则表达式比必须编写全部内容要短得多,速度也快得多。@CoreyOgburn因为如果我自己迭代字符串,我就是在用perl编写C(或FORTRAN?),目标是编写perl。正则表达式绝对不是这项工作的正确工具。tr///是“音译”,而不是“翻译”。方括号在这里是不必要的和无用的。你可能是对的,但是。
tr/~x/-~/
是你要找的。您的音译没有使用regex元字符,而是将它们视为字符串文字,将
[
替换为
[
替换为
,等等。