Perlでパッケージ名つきの関数を動的に呼び出す方法
Perlでパッケージ名つきの関数を動的に呼び出す方法を紹介します。
1.はじめに
仕事で、パッケージ名つきの関数を動的に呼び出す必要が生じました。
パッケージ名のつかない関数を動的に呼び出す方法や、オブジェクトとして呼び出す方法はネットで結構ヒットするのですが、パッケージ名つきの関数を呼び出し方が分かりません。
ということで、本エントリーでパッケージ名つきの関数を動的に呼び出す方法を備忘録でまとめておきます。
条件によって違うかもしれませんがベストプラクティスや認識誤りがあればどこかでつぶやいてください。
2.パッケージ名つきの関数を動的に呼び出す
パッケージ名つきの関数を動的に呼び出すコードは以下です。
ここではパッケージ、メソッド、引数をすべて動的(=呼び出し元のパラメータを使うという意味)に生成します。
#!/usr/bin/perl
use strict;
use warnings;
sub test {
my ( $class, $method, $param ) = @_;
eval "require $class;";
if ( $@ ) {
print "Error: " . $@;
exit;
}
my $func= "${class}::${method}(". '$param' . ")";
my $result = eval "$func;";
if ( $@ ) {
print "Error: " . $@;
exit;
}
print $result;
}
my $data;
$data->{value} = 'Hello World!';
test( 'Sample', 'foo', $data );
モジュールは以下です。
package Sample;
use strict;
use warnings;
sub foo {
my $param = shift;
print $param->{value};
return 1;
}
1;
以下、コードの解説です。
パッケージの呼び出しはevalコマンドで行います。
eval "require $class;";
パッケージが存在しない場合、$@(evalによるPerlの構文エラーメッセージ)のチェックでNGになります。
if ( $@ ) {
print "Error: " . $@;
exit;
}
たとえば次のような感じです。
Error: Can't locate Sample2.pm in @INC (@INC contains: C:/usr/site/lib C:/usr/lib .) at (eval 1) line 1.
パッケージ、メソッドとパラメータを文字列結合してメソッド呼び出しのフォーマットを生成します。パラメータはevalで評価されるよう、シングルクォーテーションで括ります。
my $func= "${class}::${method}(". '$param' . ")";
evalで「Sample::foo($param)」を起動します。起動メソッドの返却値も受け取ることができます。
my $result = eval "$func;";
指定したメソッドがみつからないなどの場合、2回目の$@のチェックでNGになります。
if ( $@ ) {
print "Error: " . $@;
exit;
}
たとえば次のような感じです。
Error: Undefined subroutine &Sample::foo2 called at (eval 2) line 1.
上記のサンプルを実行すると次のような出力を得られます(改行は入りません)。
Hello World!
1
4.参考サイト
参考サイトは以下です。ありがとうございました。
Posted by yujiro このページの先頭に戻る
- Perlでansibleライブラリを作成する方法
- perlのCPANモジュールからRPMを作成する方法
- Perlで「Subroutine permission redefined at~」を抑止する方法
- XML::Simpleのインストールでエラーになる場合の対処
- YAML::Tinyで「YAML::Tiny found bad indenting in line~」というエラーになる場合の対処
- Perlの正規表現を使って文字列をまとめて取得する方法
- Perlのハッシュでキーの有無を調べる方法
- perlで配列の途中の要素を削除する方法
- YAML::Tinyでコロンを利用する方法
- Perlで改行コードがCRのファイルを読み込む方法
- Perlで「Possible precedence issue with control flow operator」という警告の対処
- PerlのLWPで「Can't verify SSL peers without knowing which Certificate Authorities to trust」というエラーになったときの対処
- Perl+Windowsでファイルを再帰的にリネームする方法
- Perlプログラムの中でファイルの一部を書き換える方法
- Perlの「Bareword "%s" not allowed while "strict subs" in use~」というエラーについて
トラックバックURL
コメントする
greeting