我如何手动插入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;