Perlメモ:関数呼び出しを調べる時

Perlで簡単なStackTraceを出す。滅多に使わないが、どこから呼び出されたのかを知りたい時とかcaller関数を使えばいい。

$data = 1;

$data = &funcA($data);
print $data,"\n";

sub funcA {
    my $data = shift;
    $data++;

    return &funcB($data);
}

sub funcB {
    my $data = shift;
    $data = $data + 10;
    return &funcC($data);
}

sub funcC {
    my $data = shift;
    $data = $data + 100;

    &trace_print();
    return $data;

}

sub trace_print {

    #caller(0)はtrace_print関数になってしまうから入れない。
    for ($i=5; $i>0; $i--){
        my($line,$subr) = (caller($i))[2,3];
        print $subr,':',$line,"\n";
    }

}

結果はこうなる。

:
:
main::funcA:4   
main::funcB:11
main::funcC:17  <- 呼び出された順に表示する。
112      <-最後のプリント文で結果表示
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。