Jef*_*ler 8 perl moose dbix-class
我想弄清楚我的CGI :: Application中的哪个模块正在加载Moose.我试图超载"require"但我似乎没有正确的语法.如果有人可以清理以下代码,我将不胜感激:
use strict;
use warnings;
use Carp qw//;
BEGIN {
*CORE::GLOBAL::require = sub (*) {
warn "Requiring $_[0] at: " . Carp::longmess();
CORE::require (@_);
};
}
Run Code Online (Sandbox Code Playgroud)
基本上,这个脚本的问题是它实际上并没有加载任何东西.当CORE :: require(@ )被调用时,它不会"做"任何事情.我尝试直接使用$ [0] 传递脚本名称,但这只会导致脚本死锁,直到它超时.
注意:上面的脚本位于我的启动脚本的开头
dra*_*tun 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';
};
}
Run Code Online (Sandbox Code Playgroud)
这"工作",因为调用子例程引用@INC并将coderef和filename作为参数传递.见requireperldoc:
正如phaylon所提到的,您还可以使用Devel :: TraceLoad来获取应用程序运行时加载的所有模块的摘要(以及加载它们的文件的哪一行)
perl -MDevel::TraceLoad=summary my_progam.pl
Run Code Online (Sandbox Code Playgroud)
您可以通过在模块的开头插入几行来获取"调用者",找出谁正在加载特定模块.在库树中找到Moose.pm(perl -mMoose -wle'print $INC{"Moose.pm"}'并将其编辑为:
package Moose;
use Data::Dumper;
warn "!!! Moose is being loaded by: ", Dumper([caller]);
Run Code Online (Sandbox Code Playgroud)
这很快又脏,但听起来就像你需要的一切.(完成后别忘了对Moose.pm的修改!)
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |