Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発
  1. Perl
  2. 標準関数
  3. here

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