ファイルハンドルを「CGI」にするとCGIモジュールのVERSIONメソッドが呼べない件

| コメント(0) | トラックバック(0)
とあるplファイルの一部で、

-------------------------------------------------------------------------
$mod->VERSION; ### $modにはモジュール名が入る
-------------------------------------------------------------------------

としたときに、$modが「CGI」のときだけ以下のエラーが発生する。

------------------------------------------------------------------------
Software Error

Cannot find version of an unblessed reference....
------------------------------------------------------------------------

確かにCGI.pmをuseしただけでオブジェクトは作って無いけど、VERSIONメソッドはオブジェクト要らねーだろぉ???


さっぱりわけがわからなかったので、その部分のサブルーチンだけ抜き出して別ファイルを作って実行してみたらなぜか問題無し。

どうやらサブルーチンの外に問題があるらしい・・・


消去法でたどり着いたのが以下の部分。

---------------------------------------------------------
(中略)

open(CGI,$scgi) || &ends("※$scgiがオープンできません。");

my $sheb = <CGI>;
close(CGI);
  ・
  ・
  ・
(中略)
-----------------------------------------------------------


ここら辺のファイルハンドルを「CGI」にしてる部分だけコメントアウトしたらエラーが出なくなった・・・

おいおい、ファイルハンドルに「CGI」を使っちゃいけないなんて聞いたこと無いぞ的な・・・
(もちろん「CGI」を「THIS_CGI」とかにしたらOK)


もしかして、useしてるモジュール名をファイルハンドルに指定するとダメなの???
とか思って、上記の「CGI」を「DBI」とかにしてみた。

しかし、$mod->VERSION(DBI->VERSION)は正常に表示される・・・
意味不明。


ちなみに$modは、たくさんのモジュール名やそのヴァージョンが入ったリファレンスの配列(@REQ)をループさせてるうちのモジュール名がセットされる変数なのだが、
------------------------------------------------------------------------------------------------
my @REQ = (
 ['CGI', 0, 1, 'パラメータの受け渡し等に必須です。' ],
 ['CGI::Cookie', 0, 1, 'セッション管理等に必須です。' ],
    ・
    ・
    ・
)

for(@REQ){
 my $mod = $$_[0];
    ・
    ・
    ・
 eval("use $mod;");
 if(!$@){
  my $m_ver = $mod->VERSION;
      ・
      ・
 }
   ・
   ・
   ・
}
------------------------------------------------------------------------------------------------
↑の場合は「my $m_ver = $mod->VERSION;」の部分でエラーで、

------------------------------------------------------------------------------------------------
my @REQ = (
 ['CGI::Cookie', 0, 1, 'セッション管理等に必須です。' ],
 ['CGI', 0, 1, 'パラメータの受け渡し等に必須です。' ],
    ・
    ・
    ・
)
------------------------------------------------------------------------------------------------
↑の場合(CGIの直前にCGI::Cookie)の順番だとなぜかエラーが出ない・・・


まあ、結果的に「CGI」というファイルハンドルをやめたら解決したわけだが、これ以上モジュールの中身まで詮索すると確実にハマるのでやめておく。

トラックバック(0)

トラックバックURL: http://www.igreks.jp/blog/mt-tb.cgi/374

コメントする