В perl есть ли способ заставить подпрограммы печатать их имя и аргументы при вызове? - PullRequest
3 голосов
/ 21 апреля 2011

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 21 апреля 2011

Вы можете использовать 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!

Обратите внимание, что я только новичок, поэтому будьте осторожны с этим кодом.

4 голосов
/ 21 апреля 2011

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

perl -d:Trace program

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

2 голосов
/ 21 апреля 2011

Вы можете запустить код через NYTProf , когда работает под Apache через mod_perl

1 голос
/ 21 апреля 2011

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

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

...