ジャンル不定の日記です。

Perl 5.26のrequire

先週末に家PCのArch Linuxをアップデートしてたが、週明けでperlスクリプト動かしたらエラー出た。
requireの行でモジュールが見つかってない感じだった。

というわけで調べたが、Perl 5.26からモジュールのインクルードの際にカレントディレクトリが対象外になったらしい。
require以外にdoもダメらしい。
useはOKなのか?

解決方法としては
use FindBin;
use lib $FindBin::Bin;
と2行追加するとスクリプト(実行ファイルのかな?)のパスを$FindBin::Binで取得でき、use lib でディレクトリを指定するとモジュールの検索対象になる。
FindBinって知らんかったが随分前からあったぽい。
今まで実行パス取得する時は$0から末尾切り取ったりdirコマンド使ってたw

requireのところで先頭に「./」つけちゃっても良いと思ったが、後々のこと考えるとFindBinの方が良いのかな。
それに、今まで別の場所から実行するようなのはsh通してcdしてから実行してたがFindBinなら絶対パスだからperl直で良いな。
と思ったが、openとかで問題生じちゃうか・・・

自分で何か作る時はuseは使わんが分割したい場合はrequire普通に使ってるし、同じ場所か下層に置くからパス指定なんか殆どしない。
require使ってる箇所はほぼ全部問題生じるな。
家PC用のスクリプトは数が少ないが、鯖用スクリプトだと結構な箇所で使ってる気が・・・

設定ファイル読み込む感じの箇所でdoも使う。
doはrequireに比べると使うことは少ない気がするが、外部ファイル実行以外でも使うからサーチがめんどいかな・・・

一括サーチして全部修正しようかとも考えたが、サーバー変更とかの時はアプリ(サイト)ごとに確認しながらになるし、
今一括で修正しても結局全部確認することになっちゃうから5.26以上導入時に作業で良いかな。
まあ、サーバー移転やOSアップグレードの際は要注意だな。

今回はuseは問題ないみたいだしrequireじゃなくてuse使っておくべきだったのか?と思ったが、
useはperlの実行時にいきなり読み込まれちゃうがrequireだと途中で読み込める。
式で分岐して読み込むこととかもあるから、やっぱrequireだな・・・