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 (複数のモジュールが 1 か所にあり、ライブラリとして機能します)

use Module;

print "\n in includes";

Module.pm (構文エラーあり)

use strict;

sub MakeSyntaxError
{
    print "\nerror in Module 
}

1;

概念上、コア モジュールの 1 つ (例: Module.pm) に構文エラーが含まれる場合があります。したがって、CallingScript.pl でそれらをキャプチャする必要があります。Module.pmie: (低レベル)の構文エラーをファイルにキャプチャしたいと考えていCallingScript.plます。

出力:

D:\Do_analysis>CallingScript.pl

in IncludesConsumer
in IncludesConsumer
in IncludesConsumer

コンパイラ エラーが CallingScript.pl でキャッチされないのはなぜですか? 思いをぶつけてください。

ありがとう!

4

2 に答える 2

5

あなたが尋ねている問題を引き起こしているものから始まる5つのエラー:

  • 一部の からのエラーを処理しませんでしたdo
  • $!一部の時間だけチェックします。
  • $!エラーがあった場合でも true になる可能性があります。check のみ$!が両方ともdofalse$@です。
  • インクルードされたファイルの 1 つを除くすべてが、エラーの欠如を示しませんでした ( 1;)。true を返す必要があるので true をdo返すので、エラーが発生したかどうかがわかります。
  • .をuse持たないファイルですpackage

  • CallingScript.pl:

    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    do "IncludesConsumer.pm" or die "CallingScript: ".($@ || $!);
    
  • IncludesConsumer.pm(これは実際には「午後」ではありません):

    do "INCLUDES.pm" or die "IncludesConsumer: ".($@ || $!);
    print "\nin IncludesConsumer";
    1;
    
  • INCLUDES.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"$@変数が設定されます。

ただし、は最後$@のものを指します(その変形です)。では、これは正常に実行された です。 evaldo FILECallingScript.pldo "IncludesConsumer.pm"


モジュールが Perl に登場して以来、このdo FILE構文は不要です。use代わりに、ほぼすべての場合にファイルを使用するかrequire、実行時効果が必要な場合はそれらを使用します。

モジュールを正常にロードできると断言したい場合はTest::Moreuse_ok関数を参照してください。

于 2013-06-03T20:37:21.000 に答える