Поскольку вы имеете дело с одиночными символами, tr /// является очевидным ответом:
tr/~x/-~/;
Однако вам понадобится s /// для работы с более длинными последовательностями:
my %subs = ( '~' => '-', 'x' => '~' );
my $pat = join '|', map quotemeta, keys %subs;
s/($pat)/$subs{$1}/g;