in reply to Replace only unescaped metachars
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");
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Replace only unescaped metachars
by Anonymous Monk on Feb 23, 2007 at 07:50 UTC | |
by ikegami (Patriarch) on Feb 23, 2007 at 17:42 UTC |