CGI Perl 2017年02月08日 13:13   編集
perlのバージョンが新しくなったらCGIが動かなくなったという書き込みがサポート掲示板にあった。
Perl5.24ということだが、ローカルでCGIのテストに使っているXamppは最新版でもPerlのバージョンはは5.16なので、5.24での動作が確認できない。

Perlを5.24にアップデート

単体ではWindows用ActivePerlの5.24が公開されている。
Xamppの環境でこのActivePerlが使えるのかわからないが、取りあえずインストールしてみる。
XamppでPerlがインストールされているC:\xampp\perlに直接インストールしたいところだが、ダウンロードしたActivePerlのインストーラーはインストール先を変更できないようだ(それとも見落としたか?)
また、64bit版のインストーラーを使ったので、C:\Perl64というフォルダにインストールされてしまう。
取りあえずこれをXamppでインストールされたC:\xampp\perlフォルダにコピーすることにする。C:\xampp\perlは別名に変更してバックアップしておき、C:\Perl64の中身をすべてC:\xampp\perlにコピーしてみた。
これだけでうまくいくはずないよなと思ってCGIを実行してみると、あっさりと動いてしまって拍子抜けした。
print $];
でPerlのバージョンを確認してみると、無事
5.024001
と表示され、5.24にアップデートできたことが確認できた。

jcode.plのエラー

Perlをバージョン5.24にアップデートできたので、エラーが出るというCGIを実行してみると確かにエラーが出て実行できない。
エラーログを見てみるとjcode.plで
Can't use 'defined(%hash)'
というようなエラーが出ているようだ。確かにこの日本語変換ライブラリのjcode.plはかなり昔に書かれたものなので、最新のPerlで動かなくなっても不思議ではないかもしれない。Kent-Webなどで公開されているCGIを見てみるとjcode.plの後継ライブラリというjacode.plが使われているようだ。

jacode.plに更新

CPAN http://search.cpan.org/~ina/jacode/で最新版が公開されているようなので、
ダウンロードする。このうちjacode.plをjcode.plに置き換えればいいようだ。jcode.plを使っていたCGIでは
require './lib/jcode.pl'
というようなjcode.plを読み込んでいる部分を
require './lib/jacode.pl'
に変更する。
そのまま互換性があるのかよくわからないが、とりあえずエラーは出なくなった。
調べてみると同じ原因でエラーが出るCGIがけっこうあったので、すべて更新する必要があるようだ。

Jcode.pmを使用する

いまさらだけど、jcode.plのエラーを避けるためにjacode.plに更新ではなく、Jcode.pmを使うという方法もあるようなので追記しておく。Jcode.pmは最近はサーバーのほうに標準モジュールとしてインストールされているケースが多いようだが、Xampp同梱のPerlには入っていないようだ。なのでJcode.pm使う前提で公開するCGIにはライブラリディレクトリに入れておくのが無難のようだ。
例によってCPANでJcode.pmを検索し、ダウンロードしたJcode-2.0*.tar.gzを解凍し、Jcode.pmとJcodeフォルダをライブラリフォルダに入れておく。jcode.plが./libフォルダ内にあったなら、そこに入れておく。

元のCGIで
require './lib/jcode.pl';
という部分があったら
use lib './lib';
use Jcode;
と変更する。条件分岐する場合は
use lib './lib';
if ($use_jcodepm) {
eval 'use Jcode;';
} else {
require 'jacode.pl';
}
などとする必要がある。useはコンパイル時に実行されるので、if文の中に直接use Jcode;を書くと、if文の条件にかかわらずuse Jcode;が実行されてしまうからだ。

そしてjcode::またはjcode::となっている部分をすべてJcode::に変更する。
counter:29,141