考虑以下代码:
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
有没有一种相当简单的方法来获得最后一行的效果,但没有使用完整的评估?即使不考虑安全隐患(我主要信任这个字符串),这会插入我不想要的变量和内容。这可以通过一个额外的预处理步骤解决,我手动逃避美元符号等等,但这仍然感觉有点过于hacky,即使对我的口味。
答案 0 :(得分:1)
如果是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];
答案 1 :(得分:1)
@mob有正确的建议。对于一般问题:
#!/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'";