2016-12-12 12 views
3

perlのARGVに基づいてuse strict/warningsを有効/無効にすることはできますか?perlのARGVに基づいてuse strict/warningsを有効/無効にすることはできますか?

このコードを試しましたが、動作しません。私は '$ x = 2'の行で警告エラーが発生するはずだと信じています。

# Do this at the beginning of the script  
BEGIN { 
     if ($ARGV[0] =~ /^Y$/i) { 
      use strict; 
      use warnings; 
     } 
     else { 
      no strict; 
      no warnings; 
     } 
    } 

    $x = 2; 

    print "x is $x\n"; 

目的は、開発時にのみ警告メッセージを有効にすることです。

答えて

11
use strict; 

BEGIN { 
    require strict; 
    import strict; 
} 

と同等であるのでuse strict;の効果は、(ifが評価される前import strict;が評価されるので)無条件です。

さらに、use strictuse warningsの両方の影響はレキシカルスコープであるため、それらの効果はいつものように位置するカールに限定されます。

使用

no strict; # Probably not actually needed. 
no warnings; # Probably not actually needed. 
use if scalar($ARGV[0] =~ /^Y\z/i), 'strict'; 
use if scalar($ARGV[0] =~ /^Y\z/i), 'warnings'; 
+0

ありがとう!私はそれを試して、ARGV [0]がYならば正常に動作しますが、ARGV [0]が空であるか 'Y'でなければエラーを投げます。 /usr/opt/perl5/lib/5.8.8/if.pm 7行目の 'if if '(いくつかのコードがリスト・コンテキストで空のリストを返すか)の引数が少なすぎます。 BEGINは失敗しましたtest.pl 3行目 – criz

+0

固定する必要があります – ikegami

+0

私は同じ答えをgoogled。おかげで多くの仲間! – criz

0

use strictおよびuse warningsは字句です。彼らは彼らがいるブロックにのみ適用されます$x = 2useステートメントと同じブロックに置いた場合、例外がスローされます。

関連する問題