评估perl中的转义序列

时间:2012-01-05 09:20:23

标签: perl

我正在从文件中读取字符串。这些字符串包含转义序列,我希望在进一步处理之前对其进行评估。所以我这样做:

$t = eval("\"$t\"");

工作正常。但我对性能表示怀疑。如果eval每次都要求perl进程,它将成为性能杀手。我考虑做这项工作的另一种方式是正则表达式,我在SO中找到了相关的问题。

我的问题:有更好,更有效的方法吗?

编辑:在我的示例中调用eval之前,$ t包含\064\065\x20a\n。它被评估为45 a<LF>

3 个答案:

答案 0 :(得分:3)

目前还不太清楚文件中的字符串是什么样的,以及在传递给eval之前你对它们做了什么。解释中缺少一些东西。

如果您只想撤消C样式转义(也在Perl中使用),请使用Encode::Escape

use Encode qw(decode);
use Encode::Escape qw();
my $string_with_unescaped_literals = decode 'ascii-escape', $string_with_escaped_literals;

如果文件中的占位符看起来像要填充值的Perl变量,那么您将滥用eval作为穷人的模板引擎。使用没有运行任意代码的危险副作用的real one

答案 1 :(得分:1)

$string =~ s/\\([rnt'"\\])/"qq|\\$1|"/gee

string eval也可以解决问题,但它会带来一系列安全和维护问题,比如@ in string

答案 2 :(得分:0)

哦,请不要使用eval,如果有人为它提供类似&#34;系统的输入(&#39;同步;重启&#39;);&#34; ..

但是,你可以这样做:

#!/usr/bin/perl

$string = 'foo\"ba\\\'r';
printf("%s\n", $string);
$string =~ s/\\([\"\'])/$1/g;
printf("%s\n", $string);