¿Cómo puedo interpolar manualmente escapes de cadenas en una cadena Perl?
escaping string-interpolation (2)
En perl supongo que tengo una cadena como ''hello/tworld/n''
, y lo que quiero es:
''hello world
''
Es decir, "hola", luego un carácter de tabulación literal, luego "mundo", luego una nueva línea literal. O de forma equivalente, "hello/tworld/n"
(tenga en cuenta las comillas dobles).
En otras palabras, ¿hay una función para tomar una cadena con secuencias de escape y devolver una cadena equivalente con todas las secuencias de escape interpoladas? No quiero interpolar variables o cualquier otra cosa, solo escape secuencias como /x
, donde x
es una letra.
Puedes hacerlo con ''eval'':
my $string = ''hello/tworld/n'';
my $decoded_string = eval "/"$string/"";
Tenga en cuenta que hay problemas de seguridad relacionados con ese enfoque si no tiene el 100% de control de la cadena de entrada.
Editar: si desea SOLAMENTE interpolar sustituciones / x (y no el caso general de ''nada que Perl pueda interpolar en una cadena entrecomillada'') podría hacer esto:
my $string = ''hello/tworld/n'';
$string =~ s#([^//A-Za-z_0-9])#//$1#gs;
my $decoded_string = eval "/"$string/"";
Eso hace casi lo mismo que quotemeta, pero exime a los ''/' caracteres de ser escapados.
Edit2: Esto todavía no es 100% seguro porque si el último carácter es un ''/' - se ''filtrará'' más allá del final de la cadena, aunque ...
Personalmente, si quisiera estar 100% seguro, haría un hash con los subs que quería específicamente y usaría una sustitución de expresiones regulares en lugar de una evaluación:
my %sub_strings = (
''/n'' => "/n",
''/t'' => "/t",
''/r'' => "/r",
);
$string =~ s/(//n|//t|//n)/$sub_strings{$1}/gs;
Suena como un problema que alguien más ya habría resuelto . Nunca he usado el módulo, pero parece útil:
use String::Escape qw(unbackslash);
my $s = unbackslash(''hello/tworld/n'');