古いPerlプログラムではまる ( jcode.pl )
- (2023-02-24 16:39:05)
昔のCGIを引っ張り出す
昔、2000年代に公開されていたあるPerlプログラムを久しぶりに使うことになり、再度サーバにアップしてブラウザでアクセスすると「ファイルがありません」という内容のエラーとなった。久しぶりに試すと動作しない。
CGIのトラブル対応
といえば・・
(1) perlのパス? → #!/usr/local/bin/perl でよい?
(2) 文字コード? → Shift-JIS、UTF-8?
(3) パーミッション? → 700、704、705、755?
・パス問題?
ロリポップのPerlバージョンを調べるために、sshでログインして「perl -v」で調べるとバージョンは「5.30」だった。
ロリポップの説明では「#!/usr/local/bin/perl」でよい。
ちなみに「#!/usr/bin/perl」とすればバージョン「5.16」が使用される、こちらでもOKのはず。
最近Perlはバージョン「7」らしいが、「5」代で問題ないはず。
・文字コード問題?
cgiファイルは「Shift-JIS」で書かれている。
UTF-8にしたところで、動作しないと思うが、念のため書き換えてみたが、こちらも変化なし。
・パーミッション問題?
パーミッションもいろいろ試したが、関係なさそう。
・test.cgi
はたと「そもそもPerl動いている?」と疑問がわき、簡単なPerlプログラムとして「test.cgi」を作成しアップして動作させるとOK、Perlは正常に動作していることを確認した。
・・2時間くらいはまりまくり、この日は断念し、翌日再度試した。
トラブル原因を発見
sshでロリポップサイトにログインしてコンソールからPerlプログラムを起動してみた:
「./test.cgi」 → OK。ブラウザで見てもOKだし、コンソールから起動してもhtmlソースをはき出すのでOK。
そこで、問題のPerlプログラムをコンソールから叩くと下記エラーメッセージがでた:
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./jcode.pl line 684.
おお~これは・・「jcode.pl」に問題があるとか言ってるぞ・・これはいつか体験したことがあるな~と古い記録を調べたらあった:ロリポップ:ハイスピードへ移行実施
「jcode.pl」問題
「jcode.pl」が、Perl5.3に対応していないようだ。
jcode.pl の682行目辺りのコードを次のように修正する:
684行目から「 defined」をトル
(修正前) &init_z2h_euc unless defined %z2h_euc;
(修正後) &init_z2h_euc unless %z2h_euc;
693行目から「 defined」をトル
(修正前) &init_z2h_sjis unless defined %z2h_sjis;
(修正後) &init_z2h_sjis unless %z2h_sjis;
このわずか2行の修正で動く。
「jacode.pl」で uft-8 が使える
jcode.plの修正でいちおう動作するが「jacode.pl」も試してみた。
jacode.plはjcode.plの後継ライブラリの一つでこちらも動作する、しかも、uft-8をサポートしなかったjcode.plに対してサポートする。
今まで、PerlのフォームメールCGIを使うとき、htmlページも「Shift_JIS」にしていたが、今後は「uft-8」で統一できることが嬉しい。