如何在Perl字符串中手动插入字符串转义?
在perl中,假设我有一个类似于如何在Perl字符串中手动插入字符串转义?,perl,escaping,string-interpolation,Perl,Escaping,String Interpolation,在perl中,假设我有一个类似于'hello\tworld\n'的字符串,我想要的是: 'hello world ' 也就是说,“你好”,然后是文字制表符,然后是“世界”,然后是文字换行符。或者相当于,“hello\tworld\n”(注意双引号) 换句话说,是否有一个函数用于获取包含转义序列的字符串并返回包含所有转义序列的等效字符串?我不想插入变量或其他任何东西,只需转义序列,如\x,其中x是一个字母。您可以使用“eval”完成: my $string = 'hello\tworld\n'
'hello\tworld\n'
的字符串,我想要的是:
'hello world
'
也就是说,“你好”,然后是文字制表符,然后是“世界”,然后是文字换行符。或者相当于,“hello\tworld\n”
(注意双引号)
换句话说,是否有一个函数用于获取包含转义序列的字符串并返回包含所有转义序列的等效字符串?我不想插入变量或其他任何东西,只需转义序列,如
\x
,其中x
是一个字母。您可以使用“eval”完成:
my $string = 'hello\tworld\n';
my $decoded_string = eval "\"$string\"";
请注意,如果您对输入字符串没有100%的控制权,则存在与该方法相关的安全问题
编辑:如果您只想插入\x替换(而不是一般情况下的“Perl将在带引号的字符串中插入的任何内容”),可以执行以下操作:
my $string = 'hello\tworld\n';
$string =~ s#([^\\A-Za-z_0-9])#\\$1#gs;
my $decoded_string = eval "\"$string\"";
这与quotemeta的作用几乎相同,但免除了“\”字符的转义
Edit2:这仍然不是100%安全的,因为如果最后一个字符是“\”-它将“泄漏”到字符串的末尾
就我个人而言,如果我想100%安全,我会用我特别想要的sub做一个hash,并使用regex替换而不是eval:
my %sub_strings = (
'\n' => "\n",
'\t' => "\t",
'\r' => "\r",
);
$string =~ s/(\\n|\\t|\\n)/$sub_strings{$1}/gs;
听起来像是其他人会遇到的问题。我从未使用过该模块,但它看起来很有用:
use String::Escape qw(unbackslash);
my $s = unbackslash('hello\tworld\n');
我可以结合使用
eval
和quotemeta
安全地执行此操作吗?基本上,(我的$interpolated\u string=eval(q(“).quotemeta($string).q(“))=~s/\\\()/\1/g
。如果不这样做,插值也会被终止我只想插入\x
,其中x
是任意字母。不是变量或其他东西。非常感谢。我发现了String::Interpolate,但它的功能完全不同。另外,对于在Ubuntu 9.10中使用它的人来说,String::Escape的版本没有unbackslash
。相反,它具有不可打印的。