使用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。
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开一个问题或拉取请求来帮助我们。