我如何手动插入string转义的Perlstring?

在Perl中,假设我有一个string像'hello\tworld\n' ,而我想要的是:

 'hello world ' 

也就是“hello”,然后是一个字面标签字符,然后是“world”,然后是一个字面换行符。 或者等价地, "hello\tworld\n" (注意双引号)。

换句话说,是否有一个函数用一个带有转义序列的string,并返回一个等价的string与所有的转义序列插值? 我不想插入variables或其他任何东西,只是转义序列像\x ,其中x是一个字母。

听起来像别人已经解决了的问题 。 我从来没有使用模块,但看起来很有用:

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

你可以用'eval'来做:

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

请注意,如果您没有对inputstring进行100%的控制,则存在与此方法相关的安全问题。

编辑:如果你只想插入\ xreplace(而不是'任何Perl将插入引用string'的一般情况下),你可以这样做:

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

这几乎与quotemeta是一样的东西 – 但是免除了'\'字符的转义。

编辑2:这仍然不是100%安全,因为如果最后一个字符是一个'\' – 它会'泄漏'超过string的尽头…

就个人而言,如果我想要100%安全,我会做一个特别想要的潜艇的散列,并使用正则expression式替代而不是一个评估:

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