我正在从文件中读取字符串。这些字符串包含转义序列,我希望在进一步处理之前对其进行评估。所以我这样做:
$t = eval("\"$t\"");
工作正常。但我对性能表示怀疑。如果eval每次都要求perl进程,它将成为性能杀手。我考虑做这项工作的另一种方式是正则表达式,我在SO中找到了相关的问题。
我的问题:有更好,更有效的方法吗?
编辑:在我的示例中调用eval之前,$ t包含\064\065\x20a\n
。它被评估为45 a<LF>
。
答案 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);