Perl

use strict下で動的にClassをnewする

More than 1 year has passed since last update.

use strictしているときに、「クラス名」のインスタンスを作りたかったりする。

例えば、そのクラス名が設定ファイルなどに書かれていて、そのクラスをnewしたい場合。

use strict;
use utf8;

my $class = "Hoge::Fuga";
my $obj = new $class;

実は上記のperl -cは問題なく通る。

が、実行してみると「Hoge::Fuga」をuseしていないから

Can't locate object method "new" via package "CSV::Reader" (perhaps you forgot to load "Hoge::Fuga"?) at sample.pl line 4.

とか怒られる。

で、そのまま、

use $class;

とか書くと、

syntax error at sample.pl line xx, near "use $class"

と怒られる。

どうやって書くのか?

useごとevalの中に入れてしまえばよい。

use strict;
use utf8;

my $class = "Hoge::Fuga";

eval "use $class;";
if ($@) {
  die "Error!!! $@\n";
}
my $obj = new $class;

今度は怒られない。
ただ、本当に「Hoge/Fuga.pm」が無い時でも先に進んでしまうので、
$@をチェックしてevalが成功したことは確認しないといけない。