分からないことだらけの状態で初めてperlに触れることになったので。その時にはまったことを備忘録で書き残します!
そもそもPerlとは?
Perlはテキスト処理が得意なスクリプト言語で、
・バッチ処理
・ログ解析
・メール処理
などで今でも使われていることがあるらしいです。自分の仲間内だとすごいマイナーみたいです笑
暗黙的な挙動が多く、初心者には「なぜ動かないのか」が分かりづらいと感じることが多いなーと思ったり。。。
ちなみに今回はメール処理関連でperlを使っていました。
そんな中既存のファイル修正してシェルファイルを実行していく中でファイルが見つからないエラーが発生。
何故そんな問題が起きたかというと、どうやら見に行っているディレクトリ一覧@INCというところにに「./ カレントディレクトリ」が存在しないよと怒られました。
最初そもそも分からんのにどいうことやと思ってはいましたが、、
結局色々調べた結果、Perl v5.26以降の仕様変更が原因だと判明。
ここで出てきた@INCって何??
@INC は、一言で言うとPerlがモジュールを探しに行くディレクトリの一覧です。
つまりperlファイルの中に
use SomeModule;
と書くと、Perlは @INC にあるディレクトリから
SomeModule.pm を探すという挙動をするのです。
Perl v5.26以降のバージョンでで起きたこと
Perl v5.26では、セキュリティの観点から「./ カレントディレクトリ」が @INC に含まれなくなりました。
※文字通りv5.26よりも前のバージョンでは問題なく含まれていました。
なので
カレントディレクトリにモジュールがあるのにuseするとエラーになる
という状態になります。
Can't locate SomeModule.pm in @INC
イメージは上記のような感じでエラーが出ます。
対応方法
読み込み先を直感的にに指定する必要があります。
1. use lib '.';
2. use FindBin;
use lib $FindBin::Bin;
などなどがあります。
別途設定ファイルなどを読み込みたい場合も上記のような対応で問題ないですが、
ちなみに対象のファイルを@INCから読み込まなくても直接カレントディレクトリをしてしまうことも全然可能です。
※正直こっちの方が誰でもわかりやすいので簡単な気がしています。
perlを使っている環境に合わせて対応は変えるというのが一番いい対応かもしれませんね!
まとめ
-
Perl v5.26以降のバージョンではカレントディレクトリは自動では使えない。
-
use や @INC の仕組みを知る必要あり
-
@INC を意識して明示的に指定する必要がある(直接のパス指定もあり)
-
古い記事のコードのまま実行すると正常に動かないことがある
ざっとまとめると意識することはこんな感じかなーと思います。