5

我有一个 Perl 脚本,它接受用户输入并创建另一个将在以后运行的脚本。我目前正在为这些脚本编写测试,我想要执行的测试之一是检查生成的脚本是否编译成功(例如perl -c <script>。)有没有办法让 Perl 对生成的脚本执行编译无需生成另一个 Perl 进程的脚本?我已经尝试搜索答案,但搜索只会找到有关将 Perl 脚本编译为可执行程序的信息。

4

4 回答 4

6

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

于 2012-06-22T21:06:49.280 回答
3

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

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

__DATA__

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

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

syntax_ok来自库Test::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";

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


注意:感谢用户mob的帮助聊天和代码更正。

于 2012-06-22T20:41:12.233 回答
1

像这样的东西不适合你吗?

open(FILE,"perl -c generated_script.pl 2>&1 |");
@output=<FILE>;
if(join('',@output)=~/syntax OK/)
{
   printf("No Problem\n");
}
close(FILE);
于 2012-06-22T21:53:15.187 回答
1

Test::Compile模块,特别是pl_file_ok()功能。

于 2012-06-23T18:06:28.760 回答