現在のサブルーチン呼び出しのコンテキストを取得する
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 の引数 EXPR に 0 を指定すると、
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