Есть ли в perl способ заставить подпрограммы печатать свое имя и аргументы при вызове?


Мне нужно быстро понять, какие подпрограммы вызываются в беспорядке спагетти - кода модулей perl.

Я мог бы написать сценарий, чтобы пройти через все модули и добавить код, чтобы распечатать имя подпрограммы и аргументы в начале каждой подпрограммы.

Но есть ли способ переопределить сам механизм внутренней подпрограммы perl для этого?

Код выполняется под mod_perl, поэтому я не могу легко использовать отладчик.

4 3

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!
Пожалуйста, обратите внимание, что я только новичок, поэтому будьте осторожны с этим кодом.

Devel: Trace покажет вызовы подпрограмм и аргументы. Он также покажет каждую строку выполняемого кода, которая может быть более подробной, чем вам нужно.

perl -d:Trace program

Devel:: DumpTrace будет еще более подробным, показывая значения переменных.

Вы можете запустить код через NYTProf , Когда выполняется под Apache через mod_perl

Я знаю, что вы говорите, что "не можете легко использовать отладчик", потому что вы работаете под mod_perl, но есть некоторые варианты для этого, описанные здесь:

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