我想弄清楚我的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]将脚本名称传递给它,但这只会导致脚本死锁,直到它超时。
注意:以上脚本位于我启动脚本的开头
答案 0 :(得分: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和filename作为参数传递。见require
perldoc:
如phaylon所述,您还可以使用Devel::TraceLoad获取应用程序运行时加载的所有模块的摘要(以及加载它们的文件的哪一行)
perl -MDevel::TraceLoad=summary my_progam.pl
答案 1 :(得分:5)
通过在模块的开头插入几行来获取“调用者”,您可以找到加载特定模块的人员。在库树(perl -mMoose -wle'print $INC{"Moose.pm"}'
)中找到Moose.pm,然后将其编辑为:
package Moose;
use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);
这很快又脏,但听起来就像你需要的一切。 (完成后别忘了对Moose.pm的修改!)
答案 2 :(得分: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 ...