読者です 読者をやめる 読者になる 読者になる

UNIVERSAL::requireについてなんとなく...

UNIVERSAL::requireって、つまり変数にモジュールの名前の文字列をつっこんどいて、そのモジュールをrequireしたいときに使うってことかな。

参考にさせていただいたサイト


しかし動的なrequireの場合に、evalを使わなくてはならない意味が今ひとつわからない。

確かにevalなしで、

require $module;

とかやると、エラーになっちゃう。なんでだろう。

requireが$moduleを評価するタイミング??が問題なのかなぁ。

requre 'test';
requre test;

上記のこの2つを実行すると、エラーになりますが微妙に違いがあります。それは、.pmの拡張子がついているか、ついてないかの違いです。下のものがtest.pmと表示されていました。

ん〜、つまりコンパイルのときに既にrequireの引数の文字列は、確定(?)していなくてはならないが、$moduleや'test'ではコンパイルのときは、まだ確定されておらずrequireの.pmをつける機能が作動しない(?)。
だからevalで実行時にコンパイルして実行するという処理を行うことによって、変数の中身が確定されてからrequireに評価されるので、うまくいく(??)。

んんんんん...、なんだかおかしいなぁ。もうすこし調査が必要だなぁ〜




などなどいろいろ今週は悩んでましたが・・・
下記のページ読んだらわかった。

evalにはEXPR形式とBLOCK形式があり、EXPR形式では変数の値を式として評価できるようになっているということ。この2つの形式があることを認識していなかった。

上記のことを踏まえて、この記事にevalのEXPR形式とBLOCK形式の例がいくつかあり、とっても分かりやすい。

完全ではないが、これでなんとなく理解ができてきた。

[> eval関数についてのメモ
[>eval [Perl講座 -Smart]
[>UNIVERSAL::require - 変数からモジュールをrequireする