Есть ли в perl способ заставить подпрограммы печатать свое имя и аргументы при вызове?
Мне нужно быстро понять, какие подпрограммы вызываются в беспорядке спагетти - кода модулей perl.
Я мог бы написать сценарий, чтобы пройти через все модули и добавить код, чтобы распечатать имя подпрограммы и аргументы в начале каждой подпрограммы.
Но есть ли способ переопределить сам механизм внутренней подпрограммы perl для этого?
Код выполняется под mod_perl, поэтому я не могу легко использовать отладчик.
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