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

时间:2012-06-22 20:32:18

标签: perl

我有一个Perl脚本,它接受用户输入并创建另一个将在以后运行的脚本。我目前正在编写这些脚本的测试,我想要执行的其中一个测试是检查生成的脚本是否成功编译(例如perl -c <script>。)是否有一种方法可以使Perl执行生成的脚本编译而不必生成另一个Perl进程?我尝试过搜索答案,但搜索只是将有关将Perl脚本编译成可执行程序的信息。

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

__DATA__

my $a = 1;
my $b = 2;
print $a+$b, "\n";

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

Test::Strict中的函数syntax_ok通过使用外部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";

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


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

答案 2 :(得分:1)

为你赢得这样的工作吗?

open(FILE,"perl -c generated_script.pl 2>&1 |");
@output=<FILE>;
if(join('',@output)=~/syntax OK/)
{
   printf("No Problem\n");
}
close(FILE);

答案 3 :(得分:1)

请参阅Test::Compile模块,尤其是pl_file_ok()函数。