2012-10-16 8 views
41

私はBashスクリプトで多くのPerlスクリプトを呼び出しています(時にはcshからも)。Perlスクリプトにコンパイルエラーがないかどうかを確認するには?

Bashスクリプトの最初に、すべてのPerlスクリプトにコンパイルエラーがないかどうかをチェックするテストを入れたいと思います。

これを実行する方法の1つは、実際にはBashスクリプトからPerlスクリプトを呼び出し、パイプログファイルでは "コンパイルエラー"をgrepとすることですが、異なるPerlスクリプトがコードの異なるポイントので、私はこれをBashスクリプトの冒頭でやりたいと思っています。

Perlスクリプトにコンパイルエラーがないかどうかを確認する方法はありますか?

答えて

59

注意! 以下のコマンドを使用して、Perlプログラムのコンパイルエラーをチェックすることは危険です。ランダルは、あなたが

  • Sanity-checking your Perl codeをチェックアウトする必要があります。このトピックに関する非常に素晴らしい記事(Linuxの雑誌のコラム91、2007年3月)彼の記事から引用

を書いてい

$ perl -c yourperlprogram 

おそらくsi私たちが知ることができるものは "それは有効ですか?"です。このため、 は、我々がコンパイルのみの切り替え渡し、Perl自身を呼び出す:

perl -c ourprogram 

この動作のために、perlは、プログラムをコンパイル が、実行フェーズのちょうど短い停止します。これは、プログラムテキストのすべての の部分が、作業プログラムを表す内部データ 構造に変換されますが、実際には はコードを実行していないことを意味します。構文エラーがある場合は通知され、 コンパイルが異常終了します。

実際、それはちょっとした嘘です。理論的に安全な "構文チェック"中にBEGINブロック( の階層化されたいとこ、useディレクティブを含む)のおかげで、一部のPerlコードで が実行されている可能性があります。 例えば、あなたのコードが含まれている場合:

BEGIN { warn "Hello, world!\n" } 

、あなたは、 でもperlの-cの間にそのメッセージが表示されます! が "コンパイルのみ"を "コードを実行しない"と意味する人には、やや驚くべきことです。

BEGIN { system "rm", "-rf", "/" } 

を、あなたはその引数 に問題が表示されます:含まれてい コードを考えてみましょう。おっとっと。

+0

このメソッドの制限事項をお知らせいただきありがとうございます。 Btw、perl -c出力をどのようにパイプする必要がありますか? 'perl -c script.pl | grep "構文OK"は意図したとおりに動作しません。コンパイルエラーがあるときは何も返さないと思います。 – user13107

+1

気にする必要はありません! 'perl -c script.pl | grep"構文OK "' – user13107

+0

文字列出力のgrepではなく、実際の終了値を確認する方が良いでしょう。成功すると終了値は0になり、チェックに失敗すると終了値は0になります。 –

4

別にperl -c program.plから、それはコマンドを使用して警告を見つけるためにも良いでしょう:

詳細について
perl -w program.pl 

は、以下を参照してください。http://www.perl.com/pub/2004/08/09/commandline.html

-1

あなたが実行する前に、エラー/警告をチェックする必要がある場合しかし、あなたのファイルは異なり複数の他のファイルにオプションを追加することができます。-I

perl -I /path/to/dependency/lib -c /path/to/file/to/check 

編集男から-Iで指定された

ディレクトリはperlrunは、モジュールの検索パス(@INC)の前に付加されています。

関連する問題