4
package Bar;
use Foo;

sub bar { fooit "hello from bar"; }

package Foo;

sub fooit {
   # Somehow I want this function to know it was called
   # from the "Bar" module (in this case).
}

できれば、これは、呼び出し元のモジュールの名前を含む引数を明示的に渡さずに実行されます。

4

3 に答える 3

6

組み込みcaller関数を使用して、現在の呼び出しスタックに関する情報を取得できます。

 sub fooit {
     my ($pkg, $file, $line) = caller;
     print STDERR "fooit was called from the $pkg package, $file:$line\n";
 }
于 2013-03-08T17:37:24.463 に答える
2

callerスカラーコンテキストに引数がない場合は、呼び出し元の名前空間が返されます。

my $caller = caller();

また

print caller()."\n";       # '.' forces scalar context

また

print "".caller(), "\n";   # '.' forces scalar context

Carpの潜水艦の1つの動作を複製しようとしているのでない限り、それが必要になることは非常にまれです。

于 2013-03-08T17:38:37.430 に答える
1

ビルトインを使用するのcallerが最も簡単で簡単な方法ですが、Devel :: Backtraceは、エレガントなインターフェイスでより詳細な情報を提供できるCPANモジュールも見る価値があります。

package Foo;
use Devel::Backtrace;

sub fooit {
    my $backtrace = Devel::Backtrace->new;

    print $backtrace->point(1)->package, "\n\n";
    print $backtrace; 
}

package Bar;

sub bar { 
    Foo::fooit('hello from bar'); 
}

package main;

Bar::bar();

出力:

Bar

Devel::Backtrace::new called from Foo (test.pl:5)
Foo::fooit called from Bar (test.pl:14)
Bar::bar called from main (test.pl:19)
于 2013-03-09T10:40:18.277 に答える