caller関数 - 呼び出し元情報を取得する
caller関数を使用すると、呼び出し元の情報を取得することができます。
呼び出し元のパッケージ名を取得するには、スカラコンテキストでcaller関数を呼び出します。
呼び出し元のパッケージ名、ファイル名、行番号を取得するには、リストコンテキストでcaller関数を呼び出します。
# パッケージ名 my $package_name = caller; # パッケージ名、ファイル名、行番号、サブルーチン名 my ($package_name, $file_name, $line) = caller;
さらに上の階層の情報を取得するには?
さらに上の階層の情報を取得するには、caller関数に何回層上にたどるかを示す引数を与えてあげます。
# 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($i);
サブルーチン名などを追加で取得することもできます。
詳しくは公式ドキュメントをご覧ください。
サンプル
caller関数のサンプルです。
use strict; use warnings; # 実行している関数の名前を取得すする # caller print "1: 実行している関数の名前を取得する。\n"; func_name(); sub func_name{ my $this_func_name = (caller 0)[3]; # caller 関数の引数に 0 を指定すると # 自分自身の関数の情報が、取得できる。 # 4番目( 要素番号は 3)に関数名が、入っている。 print $this_func_name, "\n"; print "\n"; } print "2: パッケージ名のない関数名を取得する。\n"; func_name_none_package(); sub func_name_none_package{ my $this_func_name = ( caller 0 )[3]; $this_func_name =~ s/.*:://; print $this_func_name, "\n\n"; } print "3: 関数名取得をサブルーチン化する。\n"; test1(); sub test1{ print get_func_name() . "\n"; } sub get_func_name{ # caller関数の引数に、1 を指定すると # 呼び出し元の関数の情報を取得できる。 my $this_func_name = (caller 1)[3]; $this_func_name =~ s/.*:://; return $this_func_name; }
実行結果
1: 実行している関数の名前を取得する。 main::func_name 2: パッケージ名のない関数名を取得する。 func_name_none_package 3: 関数名取得をサブルーチン化する。 test1