Come posso intercettare manualmente gli escape di stringhe in una stringa Perl?

In perl suppongo di avere una stringa come 'hello\tworld\n' , e quello che voglio è:

 'hello world ' 

Cioè, “ciao”, quindi un carattere letterale, quindi “mondo”, quindi una nuova riga letterale. O in modo equivalente, "hello\tworld\n" (annota le virgolette).

In altre parole, esiste una funzione per prendere una stringa con sequenze di escape e restituire una stringa equivalente con tutte le sequenze di escape interpolate? Non voglio interpolare variabili o qualcos’altro, basta scappare sequenze come \x , dove x è una lettera.

Sembra un problema che qualcun altro avrebbe già risolto . Non ho mai usato il modulo, ma sembra utile:

 use String::Escape qw(unbackslash); my $s = unbackslash('hello\tworld\n'); 

Puoi farlo con ‘eval’:

 my $string = 'hello\tworld\n'; my $decoded_string = eval "\"$string\""; 

Si noti che ci sono problemi di sicurezza legati a tale approccio se non si ha il 100% di controllo della stringa di input.

Modifica: se si desidera interpolare SOLO le sostituzioni \ x (e non il caso generale di “qualsiasi cosa che Perl interpola in una stringa quotata”), si potrebbe fare ciò:

 my $string = 'hello\tworld\n'; $string =~ s#([^\\A-Za-z_0-9])#\\$1#gs; my $decoded_string = eval "\"$string\""; 

Questo fa quasi la stessa cosa di quotemeta – ma esenta i caratteri \ ‘da essere scappati.

Edit2: Questo non è sicuro al 100% perché se l’ultimo carattere è un ‘\’ – sarà ‘leak’ oltre la fine della stringa però …

Personalmente, se volessi essere al sicuro al 100%, farei un hash con i sottotitoli che volevo specificamente e usare una sostituzione regex invece di una valutazione:

 my %sub_strings = ( '\n' => "\n", '\t' => "\t", '\r' => "\r", ); $string =~ s/(\\n|\\t|\\n)/$sub_strings{$1}/gs;