perlのcallerが何かと便利、ログ取るときとか


Perlでサービス開発しているのですが、今ログデータを取るプログラムをφ(`д´)カキカキしてます。
まあ、ログ取りはサービス展開している際には基本なので、むしろ何故に今頃やっとんねんって感じです( ´Д)σ)Д)プニョプニョ

さっき書いたものは、あるデータの送るときそれがどの関数からいつ来たのか任意の文字列なり関数名なりをDBに保存させるといったもの。

どちらもそんな大変なことではなかったのですが(コントローラーまるっと書き換えましたけどね....(#・∀・))そこで使ったものが caller という関数。
↓こんな感じで

my $oniku = $args{'syake'} || (caller 1)[3];

使い方

引数なし

リストで返されます。
0: 呼び出し元のパッケージ名
1: 呼び出し元のファイル名
2: 呼び出し元の行番号

($package, $file, $line) = caller; 

引数あり

リストで返されます。
0: 呼び出し元のパッケージ名
1: 呼び出し元のファイル名
2: 呼び出し元の行番号
3: 呼び出したサブルーチン名
4: 引数の有無(1: 引数あり、2: 引数なし)
5: リストの要望(1: リストコンテキストで呼び出された場合、2: スカラーコンテキストで呼び出された場合)

引数
1: 実行している関数名が対象
2: 呼び出し元の関数が対象

my$this_func_name = (caller0)[3];
$this_func_name =~ s/.*:://;

そうそう、このままでは完全修飾名が取得されるから、
↑みたいに正規表現で要らない部分を削除したら、関数名だけがとれます。

sub get_host_func_name {
  my $host_func_name = (caller1)[3];
  $host_func_name =~ s/.*:://;
}

↑みたいな関数をメソッドをBase.pmとかの汎用ライブラリに作っておいてもいいかもなぁって思ったりもします。

...ログデータはとっても大事_〆(・ω・` )カキカキ