2016-03-23 19 views
3

use strictをperlプログラムに追加すると、重要な警告メッセージが無効になります。これはperlのバグですか?perl、 'use strict'は重要な警告を無効にします

この小さなプログラムは、問題

#!/usr/bin/perl -w 
my $rule; 
sub applyRule() { 
    eval $rule; 
} 
my $foo_bar; 
$foo_bar = "mega-foo-bar-ness"; 
$rule = 's/#FOO_BAR/$foo_bar/g'; 
$_ = "Please replace #FOO_BAR with something."; 
applyRule(); 
print STDERR "OUTPUT: $_\n"; 

を持っており、そのプログラムを実行しているときに我々は役に立ち警告メッセージが表示されます:

$ ./test1.pl 
Use of uninitialized value $foo_bar in substitution (s///) at (eval 1) line 1. 
OUTPUT: Please replace with something. 

が今だけ黙っuse strict;

#!/usr/bin/perl -w 
use strict; 
my $rule; 
sub applyRule() { 
    eval $rule; 
} 
my $foo_bar; 
$foo_bar = "mega-foo-bar-ness"; 
$rule = 's/#FOO_BAR/$foo_bar/g'; 
$_ = "Please replace #FOO_BAR with something."; 
applyRule(); 
print STDERR "OUTPUT: $_\n"; 

に置換を追加失敗する。

$ ./test1.pl 
OUTPUT: Please replace #FOO_BAR with something. 

私はPerlで神秘的なエラーを持っている私はいつも、私はいくつかの有用な警告を得るかどうかを確認するためにuse strictを削除してみてください?

編集1私はこれがWhy use strict and warnings?の複製ではない理由を説明するように頼んでいます。これは、use strictを追加すると警告が少なくなるため、デバッグが難しくなります。これは、私がuse strictとは逆の動作です。

プラグマは、他の方法で検出されるよりも早く多くのエラーをキャッチし、エラーの根本原因を簡単に見つけることができます。

編集2:誰がこれを見ての場合:別の方法は次のとおりです。

defined (eval $rule) or warn "eval error: [email protected]\n"; 

エラーが発生した場合にはevalリターンが未定義であるため。セクションのプログラミングPerlの本の状態についてのeval

構文エラーまたは実行時にエラーが発生した場合、evalのは、未定義の値を返すと$ @にエラーメッセージが表示されます。エラーがなければ、$ @はヌル文字列に設定されていることが保証されているので、後でエラーを確実にテストできます。

ただし、with versions prior to Perl 5.14 there can be problems relying on '[email protected]`に注意してください。

+0

可能な複製(http://stackoverflow.com/questions/8023959/why-use-strict-and-warnings) –

+0

短い:追加"警告を使用する 'all';"スクリプトを改善する。 –

+1

'use strict'を省略すると、宣言されていない変数を使用してもコンパイル時にエラーは発生しません。したがって、 'eval'は成功しますが、警告が出力されます。 'use strict'をインクルードすると' eval'は失敗し、警告は出力されません。 –

答えて

19

警告の代わりに、例外がスローされます。そして、あなたはevalが例外を出したかどうかを調べるためにテストしていません。

試してみてください。[?厳しいと警告を使用する理由]の

eval "$rule; 1" or warn "exception thrown: [email protected]\n"; 
+0

ありがとう、私は 'eval'を使うときにエラーを明示的にチェックする必要があることを知りました。 (私はまだ 'use strict'が警告を消すのは奇妙だと思っていますが、' eval'がエラーを報告する特別な方法を持っているからです)。 – owler

+6

未定義の値を文字列化するときに警告が表示されますが、strictを使用すると、evalが '$ rule'をコンパイルしている間に死んでしまいます。 – ysth

関連する問題