レンタルサーバのアップデートでPerl5.26になったことにより発生したCGIスクリプトエラーの解消に取り組んだ記録

レンタルサーバにてアップデートが実施され、Perlのバージョンが上がったことにより想定外のエラーに見舞われました。汎用パッケージではなく古い独自の及びフリー配布系Perl製CGIスクリプトを運用していた人には要注意です。
2022.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

プライベートでの趣味の延長上で共同運用しているレンタルサーバにアップデートが施されました。個人的にはよくあることかなーと思っていましたが、同時に実施されたPerlのバージョンアップ(from 5.16 to 5.26)が大きく影響しました。

TwitterなどSNSを見るかぎりでは、このバージョンアップに伴って利用していたCGIスクリプトが動作しなくなった、という問題が発生していました。具体的な対処方法は既に判明しており、個別のトラブルを除くと手続きが広まれば自然と収まるはずです。今回は対処手順とどうして発生したのかをまとめました。

発生したトラブル

アップデートが実施されたレンタルサーバ上でPerl製CGIスクリプトにアクセスすると 500 Internal Server Error が発生するというもの。これはアップデート実施前までは問題なく動いていたCGIスクリプトも対象となっていることを確認済みです。

CGIスクリプト単体のステータスを実際に確認した結果としては以下の通り。

  • パーミッション設定は誤っていない
  • ファイルパスに変更はない

そして実際にCGIを実行すると以下の通り。

Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at ./jcode.pl line 639.

ハッシュに対してdefinedは使えません。definedは省略した方がよいでしょう。と提言されています。

対処方法

主な要因は2つ。

  • ハッシュに対してdefinedが使えなくなった
  • @INC からカレントディレクトリが撤去された

ハッシュに対してdefinedが使えなくなった

アップデートにてPerl 5.26になったことによる影響かと思われそうですが、実際にはPerl 5.22での処置となります。

definedを存在確認に使っていた場合はexistsに差し替えます。defined(%hash)が使えなくなったあらましについては以下の記事を読むとよいかもしれません。

ハッシュに対するdefinedの呼び出しを撤去します。個別のCGIスクリプト内で利用していた場合は該当部分の修正が必須です。

- if defined(%hash)
+ if exists(%hash)

jcode.plを利用している場合は最新版2.11への差し替え、あるいは jacode.plに差し替えるのも手です。

wget https://www.rescue.ne.jp/lib/pub/lib/jcode.pl/v2.11/jcode.pl /path/to/jcode.pl

jacode.plに差し替える場合は、cpanからダウンロード、解凍し、jcode.pl設置場所にコピーしてCGIスクリプトからの呼び出しを変更するのみです。

wget https://cpan.metacpan.org/authors/id/I/IN/INA/Jacode/Jacode-2.13.4.26.tar.gz
tar xvfz Jacode-2.13.4.26.tar.gz
cd Jacode-2.13.4.26/lib
cp jacode.pl /path/to/jcode.pl
- require './jcode.pl';
+ require './jacode.pl';

@INC からカレントディレクトリが撤去された

万が一これらの対処で動作しない場合はスクリプトパスが通っていないことが原因です。これはPerl 5.26で @INC からカレントディレクトリが取り払われたことに影響しています。

対処方法としては上記記事にもあるようにlibモジュールを利用します。

use lib ".";

あとがき

該当レンタルサーバは当日中のエラーが翌日にまとめて出力される点で動作確認が非常に辛い仕様です。ですが、ssh接続にて該当CGIスクリプトをコンソールから単体実行することでの確認は可能です。

古めのCGIスクリプトは今後もライブラリのバージョンアップに伴う仕様変更にて影響があることを予想できます。ただ、特定の目的に注力したスクリプトというのは中々汎用的なパッケージでは代替し難いものです。根気よくつきあっていきましょう。

参考