这个问题可能看起来很简单,但过去几天我一直在想这个问题,我找不到答案。
我有多级脚本架构(代码如下所示)
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捕获? 请倾注你的想法。
谢谢!
答案 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 Module
在INCLUDES.pm
的编译时处理,然后也失败。在do "INCLUDES.pm"
之后,$@
变量已设置。
但是,$@
指的是 last eval
(其中do FILE
是变体)。在CallingScript.pl
中,这是do "IncludesConsumer.pm"
,运行正常。
自从Perl模块出现以来,do FILE
语法是不必要的。您希望在几乎所有情况下都use
您的文件,或者如果需要运行时效果,则require
。
如果您想声明模块可以正常加载,我会使用use_ok
函数引导您Test::More
。