多层次'做'在Perl?

时间:2013-06-03 20:19:21

标签: perl perl-module

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

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

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捕获? 请倾注你的想法。

谢谢!

2 个答案:

答案 0 :(得分:5)

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

  • 您没有处理某些do的错误。
  • 您只能在某些时候查看$!
  • 即使出现错误,
  • $!也可以为真。仅检查$! do$@均为假。
  • 除了一个包含的文件之外的所有文件都没有表示没有错误(1;)。您需要返回true,以便do返回true,以便您知道是否发生了错误。
  • use个文件没有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。这是一个非常糟糕的编程实践。请避免使用模块。

答案 1 :(得分:1)

嗯,您有以下层次结构:

CallingScript
  do IncludesConsumer
    do INCLUDES
      use Module

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

但是,$@指的是 last eval(其中do FILE是变体)。在CallingScript.pl中,这是do "IncludesConsumer.pm",运行正常。


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

如果您想声明模块可以正常加载,我会使用use_ok函数引导您Test::More