2012-06-22 10 views
5

私はユーザー入力を受け取り、後で実行される別のスクリプトを作成するPerlスクリプトを持っています。私は現在、これらのスクリプトのテストを行っており、実行したいテストの1つは、生成されたスクリプトが正常にコンパイルされているかどうかを確認することです(例:perl -c <script>)。別のPerlプロセスを起動する必要はありませんか?私は答えを探してみましたが、検索はPerlスクリプトのコンパイルに関する情報を実行可能プログラムに変換するだけです。実行中のPerlセッション内でPerlスクリプトをコンパイルするにはどうすればよいですか?

+0

"コンパイル"とはどういう意味ですか?エラーをチェックしますか?それとも実行しますか? –

+0

@ user1215106エラーを確認し、実際には実行しないでください。後で実行するときに構文エラーが原因でスクリプトが失敗しないようにしたい。 – Joel

+0

スクリプトでコードを動的に作成しますか? –

答えて

3

eval機能を使用、動的に生成されたコードを実行するには:あなただけの構文をコンパイルするか確認したい場合は、あなたが同じPerlのセッション内でそれを行うことができなくなりますただし

my $script = join /\n/, <main::DATA>; 
eval($script); # 3 

__DATA__ 

my $a = 1; 
my $b = 2; 
print $a+$b, "\n"; 

を。

機能syntax_okライブラリTest::Strictperl -cを外部のPerlインタプリタで実行して構文チェックを実行するので、内部的な方法はないと仮定します。

のみ動作し、あなたの周りのために働くことがあり、次のようになります。

my $script = join /\n/, <main::DATA>; 
eval('return;' . $script); 
warn [email protected] if [email protected]; # syntax error at (eval 1) line 3, near "1 
       # my " 

__DATA__ 

my $a = 1 
my $b = 2; 
print $a+$b, "\n"; 

このケースでは、しかし、コードの最初の行ので、[email protected]を使用してコンパイルエラー(複数可)をチェックすることができるようになりますreturn;の場合、実行されません。


注:参考になっチャットやコードの修正のため、ユーザーmobに感謝します。

+1

これはコンパイルするだけでなく、コードをコンパイルして実行します。しかし、 – mob

+0

は 'exit'を評価しても、呼び出し元プログラムを終了します。おそらく 'return'を使うか、' if(0){...} 'のコードをラップしてください。 – mob

+0

' perl -e 'eval( "exit 1;/more valid code /;"); '||エコー「ああ待って、私はmobが正しいと思います。」 – mob

6

スクリプトのコンパイルには多くの副作用があります。これにより、サブシステムが定義されます。モジュールが実行されます。何かがコンパイルされているかどうかをテストしたいだけなら、を別のインタプリタにします。これは、1つのスクリプトをテストしても後のテストで誤検出や偽陰性が発生しないことを確認する唯一の方法です。

+0

私のポイントを明確にするために最後の文を追加しました。 – ikegami

1

この作品のようなものはありませんか?

open(FILE,"perl -c generated_script.pl 2>&1 |"); 
@output=<FILE>; 
if(join('',@output)=~/syntax OK/) 
{ 
    printf("No Problem\n"); 
} 
close(FILE); 
+0

ではなく、バックティックを使用しない理由がありますか? –

+0

私はあなたを愛しています!どうもありがとうございます。この特殊な配管ソリューションは、私の特定のケースで本当に助けになりました! – gideon

1

Test::Compileモジュール、特にpl_file_ok()関数を参照してください。

関連する問題