在perl中,有没有办法让子例程在调用时打印出它们的名字和参数?

时间:2011-04-21 13:22:29

标签: perl internals

我需要快速了解在一堆意大利面条代码perl模块中调用哪些子程序。

我可以编写一个脚本来遍历所有模块并添加代码以在每个子例程的开头打印出子例程名称和参数。

但有没有办法覆盖内部perl'子程序'机制本身呢?

代码在mod_perl下运行,所以我不能轻易使用调试器。

4 个答案:

答案 0 :(得分:4)

Devel:Trace将显示子程序调用和参数。它还将显示执行的每一行代码,这可能比您需要的更详细。

perl -d:Trace program

Devel::DumpTrace会更加冗长,也会显示变量的

答案 1 :(得分:4)

您可以使用 Moose::MethodModifiers 。我对Moose了解不多,但从手册中我可以看到你可以做到。到此为止。

#!/usr/bin/perl -w
use 5.010;
use strict;
use Moose;

sub sub_one {
    say "I am sub one!";
}

sub sub_two {
    say "Guess who!";
}

# Note that the name of the function being modified isn't passed in in
# any way

for my $func qw(sub_one sub_two) {
    around $func => sub {
        my $orig = shift;

        say "Running ${func}(@_)";

        # call the original sub
        my $self = shift;
        $self->$orig(@_);
    }
}

sub_one(21, 12);
sub_two();

这会产生类似

的东西
cnicutar@aiur:~$ perl method_modifiers.pl
Running sub_one(21 12)
I am sub one!
Running sub_two()
Guess who!

请注意我只是一个初学者,所以要对这段代码保持谨慎。

答案 2 :(得分:2)

NYTProf

时,您可以通过running under Apache via mod_perl运行代码

答案 3 :(得分:1)

我知道你说你“不能轻易使用调试器”,因为你在mod_perl下运行,但是有一些选项可以做到这里描述的那样:

http://perl.apache.org/docs/1.0/guide/debug.html#Non_Interactive_Perl_Debugging_under_mod_perl