perl escaping string-interpolation

¿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'');