如何覆盖对模块函数的调用,然后在覆盖中引用该原始函数?

时间:2016-02-26 22:19:08

标签: perl override

我有一个庞大的perl脚本,它对模块中的几个函数有数百个调用,我需要跟踪执行这些函数的时间。

问题:我无法安装Devel::NYTProf(不会在我的机器上的perl 5.8.8上编译),并且在这两个函数的每个实例周围添加Devel::Timer次调用将非常耗时

我考虑过覆盖对这两个函数的调用,并且在我的覆盖内执行这两个函数,只需要几个Devel::Timer调用。我的初始尝试最终以递归循环结束。

例如:

use strict;
Use SomePackage::SomeModule;
Use Devel::Timer;

my $t = Devel::Timer->new();

$someThing = new SomePackage::SomeModule();
$someThing->someFunction('test1','test2');

$t->mark('END');
$t->report();

sub SomePackage::SomeModule::someFunction {
    $t->mark('start someFunction');
    $someThing->someFunction(@_)
    $t->mark('end someFunction');
}

这显然不起作用,但我在解决方案上没有明确的线索。

有任何想法或提示指出我正确的方法吗?

2 个答案:

答案 0 :(得分:2)

ckeditor

答案 1 :(得分:2)

感谢ikegami的基础知识,我能够得到以下代码:

use strict;
use SomePackage::SomeModule;
use Devel::Timer;

my $t = Devel::Timer->new();

$someThing = new SomePackage::SomeModule();

my $someFunctionRef = \&SomePackage::SomeModule::someFunction;

my $someFunctionTrack = sub {
    $t->mark('start someFunction');
    $someFunctionRef->(@_);
    $t->mark('end someFunction');
};

no warnings qw( redefine );
*SomePackage::SomeModule::someFunction = $someFunctionTrack;

$someThing->someFunction('test1','test2');

$t->mark('END');
$t->report();