使用eval执行存储在文本文件中的Perl代码

Perl的eval函数可以执行传递给它的任何Perl代码字符串。本文展示了如何使用eval执行存储在文本文件中的Perl代码。

让我们假设我们想要执行存储在‘print.txt’中的这个Perl语句

print "it works! \n";

我们可以编写一个简单的Perl脚本,命名为‘eval.pl’,它会将‘print.txt’的内容 slurp到字符串中,然后对该字符串调用eval

use File::Slurp;
use strict;
use warnings;

my $command = read_file('print.txt');
eval $command;

现在我们可以运行‘eval.pl’来证明它是否工作

perl eval.pl
it works!

注入代码

当在包含Perl代码的字符串上调用eval时,代码将在主程序中的子词法作用域内执行 - 类似于它被写入一个块中。这使得在主程序中声明变量,并在包含在文本文件中的代码中使用eval执行它们成为可能。让我们更新‘print.txt’,使其打印一个变量

print $message;

并将‘eval.pl’更新为声明$message并设置要打印的文本

use File::Slurp;
use strict;
use warnings;

my $command = read_file('print.txt');
my $message = "We injected this message\n";

eval $command;

现在运行代码,我们可以看到注入的消息被打印出来

perl eval.pl
We injected this message

尽管这是一个酷特性,但任何允许执行存储在文本文件中的任意代码的技术都充满了风险。所以在使用这种方法之前,请务必采取适当的谨慎和检查!


这篇文章最初发布在PerlTricks.com

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上打开一个问题或拉取请求来帮助我们。