Perls Debugger kann genau nach Ihren Wünschen graben. Zum Beispiel:
main::(-e:1): 0
DB<1> sub foo {}
DB<2> x \&foo
0 CODE(0xca6898)
-> &main::foo in (eval 5)[/usr/share/perl/5.10/perl5db.pl:638]:2-2
Es tut dies mit Devel::Peek:
=head2 C<CvGV_name_or_bust> I<coderef>
Calls L<Devel::Peek> to try to find the glob the ref lives in; returns
C<undef> if L<Devel::Peek> can't be loaded, or if C<Devel::Peek::CvGV> can't
find a glob for this ref.
Returns C<< I<package>::I<glob name> >> if the code ref is found in a glob.
=cut
sub CvGV_name_or_bust {
my $in = shift;
return unless ref $in;
$in = \&$in; # Hard reference...
eval { require Devel::Peek; 1 } or return;
my $gv = Devel::Peek::CvGV($in) or return;
*$gv{PACKAGE} . '::' . *$gv{NAME};
} ## end sub CvGV_name_or_bust
Sie könnten es üben mit
#! /usr/bin/perl
use warnings;
use strict;
package Foo;
sub bar {}
package main;
BEGIN { *baz = \&Foo::bar }
sub CvGV_name_or_bust { ... }
print CvGV_name_or_bust(\&baz), "\n";
Ausgang:
Foo::bar
Beachten Sie, dass das obige Beispiel gibt Foo:bar
ein anderer Name, aber Sie erhalten sowohl das Paket, in dem sich der Alias-Unterordner befindet, als auch seinen Namen.
Welches Problem zu lösen, das Sie versuchen, dies durch das wissen? Es könnte einen Weg geben, das zu beheben, bevor es passiert. :) –
Das Ändern von Funktionen aus anderen Klassen mag in Ruby üblich sein, ist aber eine schwarze Kunst in Perl, die für * extrem * seltene Situationen reserviert sein sollte. Warum musst du das tun? – Ether
@ 'brian d foy' Drei Jahre später versuche ich einen Komponententest zu schreiben, um zu bestätigen, dass ich eine reine Perl-Version einer Funktion unter einer Bedingung bekomme, oder eine XS-Version unter einer anderen Bedingung, und plötzlich habe ich Was meiner Meinung nach ein rechtmäßiger Anwendungsfall für die Frage dieses OP ist. ;) – DavidO