В Perl, как заменить набор символов другим набором символов за один проход? - PullRequest
5 голосов
/ 09 февраля 2012

Дано ...

Ax~B~xCx~xDx

... испускать ...

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

Я хочу заменить символы ~ на - и символы x на ~.

Я мог бы написать ...

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

... но это (похоже) проходит через строку дважды.

Ответы [ 2 ]

14 голосов
/ 09 февраля 2012

Используйте «транслитерацию» для замены на основе символов. Попробуйте это:

tr/~x/\-~/;
2 голосов
/ 10 февраля 2012

Поскольку вы имеете дело с одиночными символами, tr /// является очевидным ответом:

tr/~x/-~/;

Однако вам понадобится s /// для работы с более длинными последовательностями:

my %subs = ( '~' => '-', 'x' => '~' );
my $pat = join '|', map quotemeta, keys %subs;
s/($pat)/$subs{$1}/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...