如何在运行的Perl会话中编译Perl脚本?

Joe*_*oel 5 perl

我有一个Perl脚本,它接受用户输入并创建另一个将在以后运行的脚本.我目前正在经历和写作这些脚本测试,我想执行的检查,如果生成的脚本编译成功测试(例如一个perl -c <script>)有没有,我可以有Perl的方式对所生成的执行编译脚本而不必产生另一个Perl进程?我已经尝试搜索答案,但搜索只是将有关将Perl脚本编译成可执行程序的信息.

ike*_*ami 6

编译脚本有很多副作用.它导致子被定义.它导致模块被执行.如果你只是想测试某些东西是否编译,你需要一个单独的解释器.这是确保测试一个脚本不会导致以后的测试产生误报或漏报的唯一方法.


Ωme*_*ega 3

要执行动态生成的代码,请使用eval函数:

my $script = join /\n/, <main::DATA>;
eval($script);   # 3

__DATA__

my $a = 1;
my $b = 2;
print $a+$b, "\n";
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想编译或检查语法,那么您将无法在同一个 Perl 会话中执行此操作。

syntax_okTest::Strict中的函数通过使用外部 perl 解释器运行来运行语法检查perl -c,所以我假设没有内部方法。

唯一可能对您有用的解决方法是:

my $script = join /\n/, <main::DATA>; 
eval('return;' . $script); 
warn $@ if $@;   # syntax error at (eval 1) line 3, near "1
                 # my "

__DATA__ 

my $a = 1
my $b = 2; 
print $a+$b, "\n";
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将能够使用 检查编译错误$@,但是因为代码的第一行是return;,所以它不会执行。


注意:感谢用户mob提供的有用的聊天和代码修正。