You really do need a parser, so while a pair of substitutions is possible, it's not the most appropriate.
my %conv = ( '*' => '?', '?' => '#' ); my $conv = quotemeta(join('', keys(%conv))); my $string = 't?e\\\\xt\\\\* with escapes\\*'; my $result = $string; for ($result) { s/(?<!\\)((?:\\{2})*)([$conv])/$1$conv{$2}/g; s/\\(.)/$1/sg; } print($result, "\n");
Your code can be simplified (visually):
my $string = 't?e\\\\xt\\\\* with escapes\\*'; my $result = ''; for ($string) { /\G \\(.) /xgcs && do { $result .= $1; redo; }; /\G \* /xgcs && do { $result .= '?'; redo; }; /\G \? /xgcs && do { $result .= '#'; redo; }; /\G (.) /xgcs && do { $result .= $1; redo; }; } print($result, "\n");
An optimization of the above:
my $string = 't?e\\\\xt\\\\* with escapes\\*'; my $result = ''; for ($string) { $result .= $1 if /\G ([^\\*?]+) /xgcs; /\G \\(.) /xgcs && do { $result .= $1; redo; }; /\G \* /xgcs && do { $result .= '?'; redo; }; /\G \? /xgcs && do { $result .= '#'; redo; }; } print($result, "\n");
In reply to Re: Replace only unescaped metachars
by ikegami
in thread Replace only unescaped metachars
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |