関数を呼び出すコードがあります。しかし、この関数が属するモジュールがわかりません。この関数を変更する必要があります。
どうすれば確認できますか?
関数を呼び出すコードがあります。しかし、この関数が属するモジュールがわかりません。この関数を変更する必要があります。
どうすれば確認できますか?
このDevel::Peek
モジュールは、変数に関するあらゆる種類の情報を取得するのに非常に便利です。それを使ってできることの 1 つは、サブルーチンへの参照をダンプし、それが元になったグロブの名前を取得することです。
$ perl -MDevel::Peek -MList::Util=first -e'Dump(\&first)'
SV = IV(0x1094e20) at 0x1094e28
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x11183b0
SV = PVCV(0x10ff1f0) at 0x11183b0
REFCNT = 3
FLAGS = (POK,pPOK)
PROTOTYPE = "&@"
COMP_STASH = 0x0
XSUB = 0x7f7ecbdc61b0
XSUBANY = 0
GVGV::GV = 0x11183c8 "List::Util" :: "first"
FILE = "ListUtil.c"
DEPTH = 0
FLAGS = 0x800
OUTSIDE_SEQ = 0
PADLIST = 0x0
OUTSIDE = 0x0 (null)
そこのGVGV::GV
部分が重要なビットです。
別の解決策は ですSub::Identify
。これは、実際に渡したコード参照の名前のみを提供します。ただし、知ってDevel::Peek
おくと他の多くの状況でも便利なので、最初にそれを述べました。
Perl のデバッガーは、好きなように掘り下げることができます。例えば:
メイン::(-e:1): 0 DB<1> サブ foo {} DB<2> x \&foo 0 コード(0xca6898) -> &main::foo in (eval 5)[/usr/share/perl/5.10/perl5db.pl:638]:2-2
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
あなたはそれを行使するかもしれません
#! /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";
出力:
フー::バー
上記の例ではFoo:bar
別の名前が付けられていますが、別名サブルーチンが存在するパッケージとその名前の両方が得られることに注意してください。
関数がを使用して別のモジュールから自動的にインポートされた場合、このモジュールのグローバル変数 Exporter
で見つけることができます。@EXPORT
perl -MEncode -e 'print join "\n", @Encode::EXPORT'
decode
decode_utf8
...
関数のリストをに提供できますuse
。このようにして、関数がどのパッケージに属しているかを常に知ることができます。
use Encode qw[ encode ]; # encode() imported from the Encode module
use Data::Dumper qw[]; # no functions imported from Data::Dumper