現在のサブルーチン呼び出しのコンテキストを取得する
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