String 让perl处理字符串中的反斜杠转义

String 让perl处理字符串中的反斜杠转义,string,replace,eval,perl,String,Replace,Eval,Perl,考虑以下代码: my $str = '"line 1\n\t line 2"'; # from some JSON, or something say $str; # print literal backslashes, not what I want say eval $str; # processes backslashes, but overkill 是否有一个合理的简单方法来获得最后一行的效果,但不使用全面的评估?即使撇开安全影响不谈(我主要相信这个字符串),它也会插入我不想要的变量和

考虑以下代码:

my $str = '"line 1\n\t line 2"'; # from some JSON, or something
say $str; # print literal backslashes, not what I want
say eval $str; # processes backslashes, but overkill

是否有一个合理的简单方法来获得最后一行的效果,但不使用全面的评估?即使撇开安全影响不谈(我主要相信这个字符串),它也会插入我不想要的变量和东西。这可以通过一个额外的预处理步骤来解决,在这个步骤中,我手动避开美元符号之类的符号,但这仍然感觉有点太粗糙,即使对我的口味来说也是如此。

如果是JSON,那么就用JSON解码它

use JSON;
my $str = '"line 1\n\t line 2"'; # from some JSON, or something
my $decoded = JSON::decode_json("[$str]");
say $decoded->[0];

@暴民有正确的建议。对于一般问题:

#!/usr/bin/env perl

use strict;
use warnings;

my %unescape = map +($_ => eval "qq{\\$_}"), qw(f n r t); # etc
my $special = join '|', keys %unescape;
my $str = '"line 1\n\t line 2"';

$str =~ s{ \\ ($special) }{$unescape{$1}}xg;

print "'$str\n'";

Meh,不是核心模块,但可能是正确的答案。谢谢但是JSON::PP在核心中!!为什么地核里的东西都埋在没人能找到的地方!看,这也很接近我想要的,除了。。。为什么好东西永远不在核心?(好吧,除了HTTP::Tiny。它在核心。但似乎他们不想承认:)这是一些密集的代码!(好吧,也许不是,但我是Perl新手。)让我看看是否可以将其解压缩。在映射所暗示的循环的最后一次迭代中,$是字符串“t”,因此
“qq{\\\\$\u}”
的计算结果为
'qq{\t}
。然后eval将其转换为一个包含制表符的单字符字符串。所以我们有一个将字母t映射到制表符字符的散列。到现在为止,一直都还不错。然后我们将我们的特殊角色加入管道角色。然后我们做一些聪明的正则表达式魔术来完成事情。编辑评论:我没有注意到你更改了代码;现在更有意义了。谢谢好主意。完成:)