2012-04-04 3 views
5

親クラスの呼び出し元だと私のコードのようなものになります。Perlの継承 - 私はパッケージの発信者を見つける必要がある状況がある

Inherited.pm:

package Inherited; 
our @ISA = qw(BaseClass); 
sub new { 
    SUPER::new(); 
} 

BaseClassのを
MyClass.pmを::.PM

package BaseClass; 
sub new { 
    $a = caller(0); 
    print $a 
} 

は今はない別のクラス(MyClass.pm)を持っている

$obj = Inherited->new(); 

これは、しかし、MyClassが印刷されたステートメントである必要があります。

誰かがこれを解決する方法について私を助けてくれますか?

+0

私はあなたがこれを期待する理由を理解していません。 'Inherited'は呼び出し元です。 'Inherited'の' new() 'をチェックインし、その情報を渡すことができます。 – Cfreak

+0

@Cfreak:応答に感謝します。私は引数を使って渡すことは解決策だと受け入れていますが、親クラスの呼び出し元を見つける方法はあります。私の実際のシナリオでは、引数を渡さずにこの種の機能が必要です。 – sundar

+0

'Carp'のスタックトレース機能を使って、呼び出し元のリスト全体を検索することができるかもしれませんが(Carp :: longmess())、それは素晴らしい解決策ではありません。 CPANの 'Class :: *'モジュールを見てみましょう。そこにはより洗練されたソリューションがあるかもしれません。 – Cfreak

答えて

5

callerに引数を付けると、返されるレベルの数が分かります。現在のレベルである引数0を与えました。あなたは1つの上のレベルアップをしたい場合は、1を追加します。

use v5.12; 

package Inherited { 
    our @ISA = qw(BaseClass); 
    sub new { 
     $_[0]->SUPER::new(); 
    } 
} 

package BaseClass { 
    sub new { 
     say "0: ", scalar caller(0); 
     say "1: ", scalar caller(1); 
    } 
} 

package MyClass { 
    my $obj = Inherited->new; 
    } 

は今、結果は次のとおりです。

0: Inherited 
1: MyClass 

は常にあなたの質問では、完全なサンプルプログラムを含めることを忘れないでください。投稿したPerlコードは、callerとは無関係のさまざまな理由で壊れています。

+0

私はCarpモジュールが次のようなことをすると思います。呼び出し元がcroakerに「関連」している場合、代わりに次の呼び出し側にスキップします。あなたの応答に感謝します。 – Konerak

+0

その呼び出し元の仕組みを理解しています。 – sundar

1

投稿を正しく読んでいる場合、コンストラクタを呼び出すコールスタックの最後のフレームを見つける必要があります。

package BaseClass; 
sub new { 
    my $a = caller(0); 
    for (my $n=0; my @c=caller($n); $n++) { 
     last if $c[4] !~ /::new$/; 
     $a = $c[0]; 
    } 
    print $a; 
} 

または

package BaseClass; 
sub new { 
    my @a; 
    unshift @a, [ caller(@a) ] while caller(@a); 
    my ($a) = grep { $_->[4] =~ /::new$/ } @a; 
    print $a // caller(0); 
} 

コールスタックが

GrandChild::new 
GrandChild::init 
Inherited::new 
BaseClass::new 

のように見える場合は、2番目のコードスニペットは、コンストラクタではない中間の関数呼び出し、例えばあるケースを処理します最初のスニペットは(おそらくGrandChild)の呼び出し元を返し、2番目のスニペットはの呼び出し元を返します。

+0

ありがとうございます。あなたのソリューションも私のために働いていますが、悲しいことに私はここで1つ以上の答えを受け入れることはできません。 – sundar

関連する問題