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

问题描述:

在Perl中假设我有一个字符串像'hello\tworld\n',和我要的是:如何在Perl字符串中手动插入字符串转义字符?

'hello world 
' 

也就是说,“你好”,然后字面制表符,那么“世界”,然后字面换行符。或等价地,"hello\tworld\n"(注意双引号)。

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

听起来像一个问题,别人会有solved already。我从来没有使用模块,但它看起来很有用:

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

非常感谢。我发现String :: Interpolate,但是它做了完全不同的事情。 – 2010-04-17 22:26:32

+0

另外,对于在Ubuntu 9.10中使用它的人来说,String :: Escape的版本没有'unbacklash'。相反,它有'不可打印'。 – 2010-04-17 22:30:01

你可以用“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; 
+0

我可以使用'eval'和'quotemeta'的组合来安全地做到这一点吗?基本上,'(我的$ interpolated_string = eval(q(“)。quotemeta($ string)。q(”)))=〜s/\\(。)/ \ 1/g'。 – 2010-04-17 21:35:47

+0

不是没有它也会消除插值。 ;) – Snowhare 2010-04-17 21:45:08

+0

嗯,我只想插入'\ x',其中'x'是任何字母。不是变量或其他东西。 – 2010-04-17 22:27:13