8

CGI::ApplicationのどのモジュールがMooseをロードしているかを把握しようとしています。「require」をオーバーロードしようとしましたが、構文が正しくないようです。誰かが次のコードをクリーンアップできれば、私はそれをいただければ幸いです。

use strict;
use warnings;
use Carp qw//;

BEGIN {
  *CORE::GLOBAL::require = sub (*) { 
    warn "Requiring $_[0] at: " . Carp::longmess();
    CORE::require (@_);
  };
}

基本的に、このスクリプトの問題は、実際には何もロードされていないことです。CORE :: require(@ )が呼び出されても、何も「実行」されません。$ [0]を使用してスクリプト名を直接渡そうとしましたが、タイムアウトになるまでスクリプトがデッドロックしていました。

注:上記のスクリプトは、起動スクリプトの最初にあります

4

3 に答える 3

16

どうですか:

BEGIN {
  unshift @INC, sub {
    printf "Moose first called by pkg %s at line %d in %s\n", (caller)[0,2,1]
      if $_[1] eq 'Moose.pm';
  };
}

@INCのサブルーチン参照が呼び出され、coderef とファイル名が引数として渡されるため、これは「機能します」 。requireperldocを参照してください:

phaylonで述べたように、 Devel::TraceLoadを使用して、アプリケーションの実行中にロードされたすべてのモジュール (およびそれらをロードしたファイルの行) の概要を取得することもできます。

perl -MDevel::TraceLoad=summary my_progam.pl
于 2010-09-28T17:50:55.490 に答える
5

モジュールの先頭に数行を挿入して「呼び出し元」を取得することにより、特定のモジュールをロードしているユーザーを見つけることができます。ライブラリツリーでMoose.pmを見つけて(perl -mMoose -wle'print $INC{"Moose.pm"}'、次のように編集します:

package Moose;

use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);

これは迅速で汚いですが、必要なのはそれだけのようです。(完了したら、Moose.pmへの変更を編集解除することを忘れないでください!)

于 2010-09-28T17:34:36.097 に答える
4

*Nix:

mkdir dummy
echo > dummy/Moose.pm
perl -I./dummy /path/to/my_script.pl

概念は Windows でも同じです。

あなたは得るべきです:

Moose.pm did not return a true value at ...
于 2010-09-28T18:02:39.600 に答える