获取perl来处理字符串

时间:2017-07-21 16:34:54

标签: string perl replace eval perl5

考虑以下代码:

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,即使对我的口味。

2 个答案:

答案 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'";