Perl 5.26のrequire
先週末に家PCのArch Linuxをアップデートしてたが、週明けでperlスクリプト動かしたらエラー出た。
requireの行でモジュールが見つかってない感じだった。
requireの行でモジュールが見つかってない感じだった。
というわけで調べたが、Perl 5.26からモジュールのインクルードの際にカレントディレクトリが対象外になったらしい。
require以外にdoもダメらしい。
useはOKなのか?
解決方法としては
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だな・・・
require以外にdoもダメらしい。
useはOKなのか?
解決方法としては
use FindBin;
use lib $FindBin::Bin;
と2行追加するとスクリプト(実行ファイルのかな?)のパスを$FindBin::Binで取得でき、use lib でディレクトリを指定するとモジュールの検索対象になる。use lib $FindBin::Bin;
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だな・・・