2
perl -wle 'if (0) {no_such_func()}'

no_such_func() が呼び出されることはないため、上記は -w にもかかわらずエラーなしで実行されます。

使用していないものも含め、参照するすべての関数/モジュールを Perl にチェックさせるにはどうすればよいですか?

より現実的なケースでは、一部の関数は特別な場合にのみ呼び出される可能性がありますが、それでもそれらが存在することを確認したいと思います.

編集: perlcritic をインストールしましたが、まだ何か間違っていると思います。このファイルを作成しました:

#!/bin/perl -w   
use strict; 
if (0) {no_such_func();}

そして、perlcritic は問題ないと言いました ("source OK")。no_such_func() が存在しないことを静的解析で検出できるのでしょうか? プログラムも正常に実行されます (出力は生成されません)。

4

3 に答える 3

0

括弧なしですべてのサブルーチンを呼び出すと、コンパイル時のチェックを強制できます。したがって、以下は失敗します。

$ perl -e 'use strict; my $condvar; if ($condvar) {no_such_func}'                     
Bareword "no_such_func" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

(ただし、 と書いても失敗しませんif (0)。perl のオプティマイザーはそれ以上チェックせずにブロックごと削除しているようです)

これにより、使用する前にすべてのサブルーチンを定義する必要があるという結果になります。このように作業する場合、「前方」宣言が必要になることがあります。しかし、前方宣言が定義を取得しない可能性があります。これは、別のエラー ケースとして考えられます。

于 2013-10-27T22:49:20.250 に答える