caller

現在のサブルーチン呼び出しのコンテキストを取得する

構文

解説

caller は、サブルーチンの呼び出し元のパッケージ名、ファイル名、行番号を返します。 スカラーコンテキストでは、呼び出し元があるなら(つまり、caller がサブルーチン、または、 eval、または、require の中なら)、 そのパッケージ名を返します。そうでないなら、未定義値を返します。

sub greet {
    my $package = caller;
    print $package, "\n"; # main
}

&greet();

リストコンテキストでは、caller は、呼び出し元のパッケージ名、呼び出し元のファイル名、 そして、呼び出し元の行番号のリストを返します。

sub greet {
    my ( $package, $filename, $line ) = caller;
    print $package,  "\n";    # main
    print $filename, "\n";    # ./sample.pl
    print $line,     "\n";    # 8
}

&greet();

EXPR を引数に与えた場合、caller はデバッガ―がスタックトレースを出力するために使うような情報を追加して返します。 EXPR には、現在からどれくらいのスタックを遡るのかを指定します。

sub greet {
    #   0         1          2      3            4
    my ($package, $filename, $line, $subroutine, $hasargs,

    #   5           6          7            8       9         10
        $wantarray, $evaltext, $is_require, $hints, $bitmask, $hinthash)
    = caller(0);
}

&greet();

以下に 0 ~ 3 番目までの戻り値は以下の通りです。 4 番目 ($hasargs) 以降は perldoc を参照してください。

No. 変数名 説明 値の例
0 $package 呼び出し元のパッケージ名 main
1 $filename 呼び出し元のファイル名 ./sample.pl
2 $line 呼び出し元の行番号 10
3 $subroutine 呼び出し元のサブルーチン名 main::greet

caller の引数 EXPR0 を指定すると、 caller が記述されている関数自身の情報を返します。 1 を指定すると、caller が記述されている関数の呼び出し元の情報を返します。

sub my_func_1 {
    &my_func_2();
}

sub my_func_2 {
    my $fname0 = ( caller 0 )[3], "\n";
    print $fname0, "\n";    # main::my_func_2

    my $fname1 = ( caller 1 )[3], "\n";
    print $fname1, "\n";    # main::my_func_1
}

&my_func_1();

caller は主に呼び出し元によって処理を変えたい場合に役に立ちます。

sub morning {
    &greet();
}

sub night {
    &greet();
}

sub greet {
    my $func_name = ( caller 1 )[3];
    if ( $func_name eq 'main::morning' ) {
        print "Good Morning\n";
    }
    elsif ( $func_name eq 'main::night' ) {
        print "Good Night\n";
    }
    else {
        print "Hello\n";
    }
}

&morning();    # Good Morning
&night();      # Good Night