Si solo tuvieras secuencias de escape 'normales', lo podrías resolver de forma muy fácil: evaluando dos veces.
Using perl Syntax Highlighting
my $string = '\aHola\n\tDOS EOL\r\n';
$string = eval qq{qq{$string}};Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
El problema es para los casos en que '\a', como pones, esté en 'america\\argentina'.
Si no encuentras una regla fija que diga que eso es una secuencia de escape, o no, no podremos sacar una solución.
Yo probaría el módulo
String::Escape, con la función unprintable(). Pero aún así, no es capaz de distinguir el caso de '\\argentina'.
Actualización: Sería posible resolverlo si hicieras un truco: doblas los '\\' y luego haces una conversión manual:
Using perl Syntax Highlighting
#!/usr/bin/perl
my %escapes = (
'\\\\' => '\\',
'\t' => "\t",
'\r' => "\r",
'\n' => "\n",
'\a' => "\a",
);
my $string = '\aHola\n\tDOS\\\\nEOL\r\n';
print "$string\n";
$string =~ s[\\\\
][\\\\\\\\
]g
;
print "$string\n";
$string =~ s[(\\
.)][$escapes{$1}]g
;
print "$string\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Salida:
- Código: Seleccionar todo
\aHola\n\tDOS\\nEOL\r\n
\aHola\n\tDOS\\\\nEOL\r\n
Hola
DOS\\nEOL
Fíjate: doblamos los pares de '\' y luego lo reducimos con la ayuda del hash.
Otra forma más corta:
Using perl Syntax Highlighting
#!/usr/bin/perl
my $string = '\aHola\n\tDOS\\\\nEOL\r\n';
print "$string\n";
$string =~ s[\\\\
][\\\\\\\\
]g
;
print "$string\n";
$string = eval qq{qq{$string}};
print "$string\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
- Código: Seleccionar todo
\aHola\n\tDOS\\nEOL\r\n
\aHola\n\tDOS\\\\nEOL\r\n
Hola
DOS\\nEOL
Es decir: ya que el caso de '\\' es excepcional, lo 'escapamos' de forma directa, para que luego, todo el conjunto, pueda ser
evaluado dos veces, para hacer efectivo todas las secuencias de escape.