如何在Perl字符串中手动插入字符串转义?

时间:2010-04-17 21:21:56

标签: perl escaping string-interpolation

在perl中假设我有一个像'hello\tworld\n'这样的字符串,我想要的是:

'hello  world
'

即“hello”,然后是文字制表符,然后是“world”,然后是文字换行符。或者等效地,"hello\tworld\n"(注意双引号)。

换句话说,是否有一个函数用于获取带有转义序列的字符串并返回一个等效的字符串,其中插入了所有转义序列?我不想插入变量或其他任何东西,只需转义\x之类的序列,其中x是一个字母。

2 个答案:

答案 0 :(得分:8)

听起来像是其他人会solved already的问题。我从未使用过该模块,但它看起来很有用:

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

答案 1 :(得分:2)

您可以使用'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%安全,我会使用我特别想要的子代码进行哈希并使用正则表达式替换而不是eval:

my %sub_strings = (
    '\n' => "\n",
    '\t' => "\t",
    '\r' => "\r",
);

$string =~ s/(\\n|\\t|\\n)/$sub_strings{$1}/gs;