LoginSignup
1
1

More than 5 years have passed since last update.

PERL5OPT -M vs. コマンドラインスイッチ -M

Last updated at Posted at 2015-12-22

# 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 > スクリプト内の順に呼ばれてる模様。

後になって、先人の情報に気付く。


  1. この事自体は、 PERL5OPT をクリアしてたりしなかったりして、作業してたのが原因。 

  2. なんで PERL5OPT='-MO=Deparse -Mwarnings' perl -Mwarnings -le 'sub h{ 1 } ; sub h{ 2 }' -M-warnings=redefine みたいなコードで検討してないかは、実行してみれば分る。 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1