web-dev-qa-db-ja.com

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

Bashスクリプトで多くのPerlスクリプトを呼び出しています(cshからも呼び出されます)。

Bashスクリプトの開始時に、すべてのPerlスクリプトにコンパイルエラーがないかどうかをチェックするテストを配置します。

これを行う1つの方法は、実際にBashスクリプトからPerlスクリプトを呼び出し、パイプされたログファイル内の「コンパイルエラー」に対してgrepを呼び出すことですが、異なるPerlスクリプトがコードなので、Bashスクリプトの最初にこれを実行したいと思います。

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

48
user13107

注意してください!!

以下のコマンドを使用してPerlプログラムのコンパイルエラーをチェックするのは危険です。

$ Perl -c yourperlprogram

Randalはこのトピックに関する非常に素晴らしい記事を書いています。

彼の記事から引用:

おそらく最も簡単なことは、「有効ですか?」です。このために、コンパイルのみのスイッチを渡して、Perl自体を呼び出します。

Perl -c ourprogram

この操作では、Perlはプログラムをコンパイルしますが、実行フェーズの直前で停止します。これは、プログラムテキストのすべての部分が作業プログラムを表す内部データ構造に変換されることを意味しますが、実際にはコードを実行していません。構文エラーがある場合は通知され、コンパイルは中止されます。

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

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

その後、Perl -c!中でもメッセージが表示されます。これは、「コンパイルのみ」を「コードを実行しない」ことを意味していると考える人にとってはやや驚くべきことです。以下を含むコードを検討してください。

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

その引数に問題があることがわかります。おっとっと。

66
Chankey Pathak

の他に Perl -c program.pl、次のコマンドを使用して警告を見つけることをお勧めします。

Perl -w program.pl

詳細については、以下を参照してください: http://www.Perl.com/pub/2004/08/09/commandline.html

5
Bharat Jain

私は次の part をより大きなPerlプロジェクトにbash funcを使用します:

 # foreach Perl app in the src/Perl dir
 while read -r dir ; do

  echo -e "\n"
  echo "start compiling $dir ..." ;
  cd $product_instance_dir/src/Perl/$dir ;

  # run the autoloader utility
    find . -name '*.pm' -exec Perl -MAutoSplit -e 'autosplit($ARGV[0], $ARGV[1], 0, 1, 1)' {} \;

       # foreach Perl file check the syntax by setting the correct INC dirs
     while read -r file ; do
        Perl -MCarp::Always -I `pwd` -I `pwd`/lib -wc "$file"
        # run the perltidy inline
        # perltidy -b "$file"
        # sleep 3
        ret=$? ;
        test $ret -ne 0 && break 2 ;
     done < <(find "." -type f \( -name "*.pl" -or -name "*.pm" \))

     test $ret -ne 0 && break ;

     echo "stop compiling $dir ..." ;
     echo -e "\n\n"
     cd $product_instance_dir ;

 done < <(ls -1 "src/Perl")
0
Yordan Georgiev