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で指摘をもらいました。

Qiitaで
「3分間Perlテキストクッキング」
という連載を始めました。
テキスト処理を題材にして、3分くらいで読める分量で、書いていきます。
文字コード、テキストデータ、コンピュータにおけるテキストの扱いなど、ソフトウェアの基礎の話題も
3分間Perlテキストクッキング