require, import instead of use

| コメント(3) | トラックバック(2)

今日わかった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 に詳しくでてる。

トラックバック(2)

トラックバックURL: http://blog.clouder.jp/mt/mt-tb.cgi/158

最近何故かPerl仕事が多くてPerl熱が上がって来てます。(PHPの開発チーム... 続きを読む

最近何故かPerl仕事が多くてPerl熱が上がって来てます。(PHPの開発チーム... 続きを読む

コメント(3)

> どうやら、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ってこういうときに使うのか…。
φ(。。)メモメモ

コメントする

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12