# PERL5OPT を設定してない人には無関係な話
PERL5OPT
コマンドラインオプション(スイッチ)です。 この変数のスイッチは全ての Perl コマンドラインで指定されたかのように 扱われます。
[引用元]
-mmodule はプログラムの実行前に use module (); を 実行します。
-Mmodule はプログラムの実行前に use module ; を実行します。 モジュール名の後ろに追加のコードを加えるためにクォートを使うこともできます; つまり '-MMODULE qw(foo bar)' などです。
[引用元]
躓き
ことの始めは、自分の環境によって、
$ perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 } ' -M-warnings=redefine
の no warnings qw(redefine)
が効いたり効かなかったりした事より1。
挙動
PERL5OPT ON
$ PERL5OPT=-Mwarnings perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 }' -M-warnings=redefine
Subroutine h redefined at -e line 1.
no warnings qw(redefine)
が効かない。
PERL5OPT OFF
$ PERL5OPT='' perl -Mwarnings -le 'sub h{ 1 } ; sub h { 2 }' -M-warnings=redefine
no warnings qw(redefine)
が効く。
以下ぐだぐだ書いたのを全部消して
B::Deparse が(実質) no 出来ないのと、複数回与えれば、複数回 Deparse する事を利用して2。
$ PERL5OPT=-M-O=Deparse perl -le 1 -MO=Deparse -MO=Deparse
BEGIN { $/ = "\n"; $\ = "\n"; }
use O (split(/,/, 'Deparse', 0));
no O (split(/,/, 'Deparse', 0));
'???';
(中略)
-e syntax OK
なるほど、PERL5OPT
は、コマンドラインの後に呼ばれる事が明白。
結論
-
PERL5OPT
でなんらかのモジュールセットしてる人は、コマンドラインからフラグなどセットし直しても効きません。 - コマンドライン >
PERL5OPT
> スクリプト内の順に呼ばれてる模様。