2

这个问题可能看起来很简单,但我在过去几天一直在思考这个问题,我找不到答案。

我有多级脚本架构(代码如下所示)

CallingScript.pl(包括顶级库并检查编译器错误)

do "IncludesConsumer.pm";

print "\n callingScript error : $@" if($@ || $!);

do "IncludesConsumer.pm";

print "\n callingScript error : $@" if($@);

do "IncludesConsumer.pm";

print "\n callingScript error : $@" if($@);

IncludesConsumer.pm(添加库 INCLUDES.pm 并有自己的功能)

do "INCLUDES.pm";

print "\nin IncludesConsumer";

INCLUDES.pm(多个模块在一个地方,作为一个库)

use Module;

print "\n in includes";

Module.pm(带有语法错误)

use strict;

sub MakeSyntaxError
{
    print "\nerror in Module 
}

1;

在概念上,一个核心模块(例如 Module.pm)可能包含语法错误。所以我需要在 CallingScript.pl 中捕获它们。即:我想Module.pm在文件的(低级)中捕获语法错误CallingScript.pl

输出:

D:\Do_analysis>CallingScript.pl

in IncludesConsumer
in IncludesConsumer
in IncludesConsumer

为什么 CallingScript.pl 中没有发现编译器错误?请倾诉你的想法。

谢谢!

4

2 回答 2

5

五个错误,从导致您询问的问题的一个开始:

  • 您没有处理来自某些do.
  • 你只检查$!一些时间。
  • $!即使有错误也可以是真的。只有检查$!是两者do并且$@是错误的。
  • 除了一个包含的文件之外,所有文件都没有表示缺少错误 ( 1;)。你需要返回true所以do返回true,这样你就知道是否发生了错误。
  • useda 文件没有package.

  • CallingScript.pl

    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    
  • IncludesConsumer.pm(这实际上不是“pm”):

    do "INCLUDES.pm" or die "IncludesConsumer: ".($@ || $!);
    print "\nin IncludesConsumer";
    1;
    
  • INCLUDES.pm(这实际上不是“pm”):

    use Module;
    print "\n in includes";
    1;
    
  • Module.pm(有语法错误)

    package Module;
    sub MakeSyntaxError {
    1;
    

真的没有理由以do这种方式使用。这是一个非常糟糕的编程实践。请避免使用它以支持模块。

于 2013-06-03T21:28:28.700 回答
1

好吧,您有以下层次结构:

CallingScript
  do IncludesConsumer
    do INCLUDES
      use Module

在的use Module编译时处理INCLUDES.pm,然后也会失败。之后do "INCLUDES.pm",设置$@变量。

但是, the$@指的是最后一个 eval(其中do FILE一个变体)。在CallingScript.pl中,这是do "IncludesConsumer.pm"运行良好的 。


自从do FILEPerl 出现模块以来,语法是不必要的。您希望use在几乎所有情况下都使用您的文件,或者require如果需要运行时效果则使用它们。

如果您想断言可以正常加载模块,我建议您Test::More使用该use_ok功能。

于 2013-06-03T20:37:21.000 回答