【问题标题】:get perl to process backslash escapes in string让 perl 处理字符串中的反斜杠转义
【发布时间】:2017-12-27 19:11:17
【问题描述】:

考虑这段代码:

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

是否有一种相当简单的方法来获得最后一行的效果,但不使用成熟的 eval?即使抛开安全隐患(我主要信任这个字符串),这也会插入我不想要的变量和东西。这可以通过一个额外的预处理步骤来解决,我手动转义美元符号等,但这仍然感觉有点太老套了,即使是我的口味。

【问题讨论】:

标签: string replace eval perl


【解决方案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'";

【讨论】:

  • 那是一些密密麻麻的代码! (好吧,也许不是,但我是 Perl 的新手。)让我看看我能不能解压它。在映射所暗示的循环的最后一次迭代中,$_ 是字符串“t”,因此"qq{\\$_}" 的计算结果为'qq{\t}'。然后 eval 将其转换为包含制表符的单字符串。所以我们有一个哈希将字母 t 映射到一个制表符。到目前为止,一切都很好。然后我们将特殊字符与管道字符连接起来。然后我们做一些聪明的正则表达式魔术来完成事情。编辑评论:我没有注意到您更改了代码;现在更有意义了。谢谢!
  • 好主意。完成:)
【解决方案2】:

如果是 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];

【讨论】:

  • 嗯,不是核心模块,但可能是正确的答案。谢谢!
  • 但是 JSON::PP 是核心!!为什么核心中的所有东西都埋在没人能找到的地方!
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多