Perlで@INCからカレントディレクトリが削除されたらしい

@INC

  • 古いPerlベースのCGIを動かしたら、カレントディレクトリに存在するはずのライブラリを読み込んでくれなくてエラーになってしまった。調べてみると、5.26で@INCからカレントディレクトリが削除されたのだとか。セキュリティ対策としては正しいけど、こういうときに困りますね...
[Mon Jun 05 21:16:37.994533 2023] [cgi:error] [pid 17636:tid 1108] [client 127.0.0.1:51684] AH01215: Can't locate imgsize.pl in @INC (@INC contains: E:/Bin/perl/perl/site/lib E:/Bin/perl/perl/vendor/lib E:/Bin/perl/perl/lib) at E:/Htdocs/cgi/imgboard/imgboard.cgi line 1388.\r: E:/Htdocs/cgi/imgboard/imgboard.cgi, referer: http://127.0.0.1/cgi/imgboard/
0046 2023] [cgi:error] [pid 17636:tid 1108] [client 127.0.0.1:51697] AH01215: Can't locate imgsize.pl in @INC (@INC contains: E:/Bin/perl/perl/site/lib E:/Bin/perl/perl/vendor/lib E:/Bin/perl/perl/lib) at E:/Htdocs/cgi/imgboard/imgboard.cgi line 1388.\r: E:/Htdocs/cgi/imgboard/imgboard.cgi

gihyo.jp
teratail.com

defind()

  • CGIスクリプトの最初の方にpush(@INC,'./');を追加するという強引な方法で動かしてみると、今度はdefined()関数のエラーが発生する。しかもjcode.plかあ。
  • 本来であればスクリプトのアップデートを図るのが筋だけど、20年以上前のPerl CGIなんてメンテナンスされてないし、自分で修正するのも現実的では無い。それであれば、5.14とかの古いPerlを別枠で動かしてしまった方が速そうな気がする。
  • というわけで、Strawberry Perl 5.14のポータブル版を別ディレクトリに設置して、絶対パスで指定してCGIを修正したら動いたよ!これだったら、半ば諦めていたhnsも復活させられるかもしれない。UNIX環境だとこういう小回りのきいた使い方が出来ないけど、Windowsだとどうにかなっちゃうのが面白い。
[Mon Jun 05 21:26:53.039799 2023] [cgi:error] [pid 17636:tid 1108] [client 127.0.0.1:51924] AH01215: Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at jcode_sj.pl line 599.\r: E:/Htdocs/cgi/imgboard/imgboard.cgi
[Mon Jun 05 21:26:53.039799 2023] [cgi:error] [pid 17636:tid 1108] [client 127.0.0.1:51924] AH01215: Compilation failed in require at E:/Htdocs/cgi/imgboard/imgboard.cgi line 1405.\r: E:/Htdocs/cgi/imgboard/imgboard.cgi

strawberryperl.com

HNSが動いちゃったよ...!?

www.h14m.org

  • スクリプト冒頭の#!/usr/bin/perlをStrawberry Perl 5.14のパスに変更して、config.phのディレクトリ関係を修正したら動いてしまった。2019年頃にチャレンジして挫折したのが嘘のような裏技的アプローチですが、世間一般に公開するわけでも無く、ローカルPC上のApacheで動かすだけだから問題ありません。
$DiaryDir = "E:/.../diary";
$MyDiaryURI = "http://127.0.0.1/diary/"; 
$IncludeDir = "E:/Htdocs/diary";
  • 何だかんだで個人の日記はHNS型式で記録する癖が付いているので、今更他の型式に移行も出来なくて、HNSが動かなくなってからも蓄積され続ける状態だったので非常にうれしいです。