アプリ版:「スタンプのみでお礼する」機能のリリースについて

ある条件を満たすときだけuse(あるいはrequire)をするということはどうしたらできますか。例えば、次のように、perlの版を判別してuseする/しないを分岐したいのですが、ifではできません。目的は、jperl環境で作成したプログラムを最新のperl環境に移行することです。

if ($]=~/^5\.12/){
use encoding 'cp932';
use Encode;
use subs qw(length);
sub length {
CORE::length(encode('cp932',shift));
}
   #以下色々な関数を定義する
}

A 回答 (2件)

use がコンパイル時に処理するのに対して require は「そこにきたとき」に処理します. なので, require であれば普通に if で分岐できます.



use はそのまま書くと if の条件に関係なく処理するから, #1 のように eval するくらいだと思います. 十分新しい Perl なら if ってプラグマがあるんだけど, jperl にはないと思う.

ところで, この length ってあってる? なんか decode っぽい気がするんだけど.... あと, 本当ならこんな小手先の対応でお茶を濁すんじゃなくって, きちんと書き直す方がいいんだよね.
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/02 10:23

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 でした。

この回答への補足

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

補足日時:2011/09/27 21:04
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/27 21:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!