今日わかったperlの不思議。
perl でモジュールを use しますが、時としてクラス名を動的に生成して use したい時があります。
そんなときは以下のようにします。
my $class = "Foo::Bar::$baz";
eval qq(require $class; import $class);
よくやる間違いは、
my $class = "Foo::Bar::$baz";
eval { require $class; import $class };
これをやっても use されないようだ。この eval の用法はエラーをトラップしたりするときに使用するものです。最初の例は、引数を perl の構文として評価するもの(だと思っている…)
ようは、eval EXPR はシンタックスエラーを実行時に $@ に返すのに対し、 eval BLOCK はシンタックスエラーをコンパイル時に返す点が異なる(らしいw)
require $class; import $class を perl の構文として評価するといいらしい。
なじぇ?
どうやら、require は bareword でないとだめなようだ。
だから、eval qq() とかやると require に bareword を渡すことができるんだろな。
これは、perldoc -f require に詳しくでてる。

> どうやら、require は bareword でないとだめなようだ。
というより、bareward の場合に、"::" -> "/" をして末尾に ".pm" を付けるということかと思う。
require "Apache::Request";
# ↑Apache::Request というファイルを require
require Apache::Request;
# ↑Apache/Request.pm というファイルを require
ちなみに、
require "HTML/Parser.pm";
my $p = HTML::Parser->new( ... );
みたいなのも可能。
だって上記は、bareword で書いた
require HTML::Parser;
と等価なので。
多分ですが。。。
「動的にモジュールをrequire」 でよければ
CPAN に登録されている UNIVERSAL::require を
使うと
my $mod = 'Some::Module';
$mod->require ;
とかできますね。
>nipotanさん
ふむふむ。そうだね。barewordじゃないとその引数のファイル名をrequireしようとするのだな。。。
>sekimuraさん
なるほど、UNIVERSAL::requireってこういうときに使うのか…。
φ(。。)メモメモ