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

在*尼克斯:

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 回答