Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl

Perl 5.26への@INC問題にアップグレード前に対処しておきましょう

Perl 5.26では、セキュリティ上の問題で、モジュールのインクルードパスから「.」(カレントディレクトリ)が取り除かれます。

この問題についてはcharsbarさんの記事が詳しいです。

Perl 5.26にアップグレードする前にこの問題に対処しておく

CPANモジュールについては、この問題については対処してくれるようですので、修正の必要があるのは、自社で使っているスクリプトです

僕の会社でも、古いCGIスクリプトが一部現役で動いていたりします。ちょっと調べてみると、Perl 5.26にアップグレードする前には、スクリプトを一部修正する必要があるようでした。jcode.plやcgi-lib.plが読み込まれているものがちらほらとあります。

そこで、以下のようにfindといくつかのコマンドを組み合わせて、修正の必要がある箇所を表示できるコマンドを作ってみました。

find . \( -name \*.pl -or -name \*.pm -or -name \*.cgi \) | xargs grep -e require -e do[^a-zA-Z];

Perlスクリプトが存在するディレクトリの一番上の階層で上記のコマンドを実行すると、拡張子が「.pl」「.pm」「.cgi」のスクリプトの中にある「require」と「do」を使っている場所をすべて抽出できます。

たとえば以下のような行が出力されるでしょう。

require "mylib.pl";
do "myconf.pl";

こういう場所が見つかった場合は、スクリプトの先頭に、次のように追加しましょう。スクリプトが存在するディレクトリの絶対パスが、モジュールのインクルードパスに追加されます。

use FindBin;
use lib $FindBin::Bin;

(参考)FindBin

アップグレードしてから対処するよりも、アップグレード前に対処しておくと楽です。

追記

何回も「.」が@INCの先頭に追加されていると書いてきましたが、「.」が末尾に追加されているの間違いでした。Twitterで指摘をもらいました。

  • Perlとはテキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。
  • Linuxサーバーでのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意
  • Perlはgitopensslなど広く普及したUnix/Linuxミドルウェアの補助ツールとして採用実績あり。後方互換性とポータビリティの高さがひとつの理由と推測。
  • 大量のテキストを扱うWeb開発も得意。ロングテールSEOを意識したWebサイト、アドテクやソーシャルゲームでの50ms以内のJSONの生成など。