• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:条件分岐によってuseやrequireをする)

条件分岐によってuseやrequireをする方法

このQ&Aのポイント
  • 条件分岐を使用して、特定の条件を満たした場合にuseやrequireを実行する方法を教えてください。
  • 例えば、Perlのバージョンを判別し、条件によって特定のモジュールを使用するかどうかを分岐させたいです。
  • 具体的には、もともとjPerl環境で作成したプログラムを最新のPerl環境に移行するため、条件分岐を使ってモジュールの読み込みを制御したいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

use がコンパイル時に処理するのに対して require は「そこにきたとき」に処理します. なので, require であれば普通に if で分岐できます. use はそのまま書くと if の条件に関係なく処理するから, #1 のように eval するくらいだと思います. 十分新しい Perl なら if ってプラグマがあるんだけど, jperl にはないと思う. ところで, この length ってあってる? なんか decode っぽい気がするんだけど.... あと, 本当ならこんな小手先の対応でお茶を濁すんじゃなくって, きちんと書き直す方がいいんだよね.

noname#226683
質問者

お礼

ご回答ありがとうございました。細かくなるので省略しますが、色々と問題があり、たしかに書き直した方が早そうです。

その他の回答 (1)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

eval を使うのはどうでしょうか。 if ($]=~/^5\.12/){ eval qq{ use encoding 'cp932'; use Encode; use subs qw(length); sub length { CORE::length(encode('cp932',shift)); }; }; die $@ if ($@); } ところで、$] は 5.12 でよいのでしょうか。 perl 5.14.1 だと $] は 5.014001 でした。

noname#226683
質問者

お礼

失礼しました。qqを見落としていました。

noname#226683
質問者

補足

早速のご回答ありがとうございます。ご指摘のとおり版の数字は間違っていました。 この方式ですと、jperl 環境では(つまりifが偽になる場合)、Encodeなどのモジュールが存在しないため、プリコンパイルの段階でエラーになるようです。

関連するQ&A