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
Perlゼミ

