在perl中计算转义序列

在perl中计算转义序列,perl,Perl,我正在从文件中读取字符串。这些字符串包含转义序列,我希望在进一步处理它们之前对其进行评估。因此,我: $t = eval("\"$t\""); 这很好用。但我对表演有点怀疑。如果eval每次都要分叉一个perl进程,那么它将是一个性能杀手。我考虑过的另一种方法是regex,在这里我发现了一些相关的问题 我的问题是:有没有更好、更有效的方法 编辑:在我的示例中调用eval之前,$t包含\064\065\x20a\n。它被评估为45a哦,gah不要为此使用eval,如果有人向它提供诸如“系统('s

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

$t = eval("\"$t\"");
这很好用。但我对表演有点怀疑。如果eval每次都要分叉一个perl进程,那么它将是一个性能杀手。我考虑过的另一种方法是regex,在这里我发现了一些相关的问题

我的问题是:有没有更好、更有效的方法


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

哦,gah不要为此使用eval,如果有人向它提供诸如“系统('sync;reboot');”之类的输入,这是危险的

但是,你可以这样做:

#!/usr/bin/perl

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

哦,gah,不要为此使用eval,如果有人向它提供“系统('sync;reboot');”之类的输入,这是很危险的

但是,你可以这样做:

#!/usr/bin/perl

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

在转到
eval
之前,不太清楚文件中的字符串是什么样子,以及您对它们做了什么。解释中缺少了一些东西

如果您只是想撤消C风格转义(也在Perl中使用),请使用:


如果文件中有类似Perl变量的占位符,您希望用值填充这些占位符,那么您就是在滥用
eval
作为穷人的模板引擎。使用不会产生运行任意代码的危险副作用的文件。

在转到
eval
之前,不太清楚文件中的字符串是什么样子以及您对它们做了什么。解释中缺少了一些东西

$string =~ s/\\([rnt'"\\])/"qq|\\$1|"/gee
如果您只是想撤消C风格转义(也在Perl中使用),请使用:

如果文件中有类似Perl变量的占位符,您希望用值填充这些占位符,那么您就是在滥用
eval
作为穷人的模板引擎。使用不会产生运行任意代码的危险副作用的

$string =~ s/\\([rnt'"\\])/"qq|\\$1|"/gee
stringeval也可以解决这个问题,但它带来了大量的安全和维护问题,比如string中的@


string eval也可以解决这个问题,但它带来了大量的安全和维护问题,比如@in string

,这将是性能杀手。幸运的是,
eval
不会在每次调用perl进程时都派生它。这将是一个性能杀手。幸运的是,
eval
并没有在每次调用它时都派生一个perl进程。我承认使用eval可能是危险的,但在我的例子中,我不能让它错误地工作。你有一个会引发问题的例子吗?我承认使用eval可能是危险的,但在我的情况下,以你的例子,我不能让它工作错误。你有没有引发问题的例子?