ユーザー入力を受け取り、後日実行される別のスクリプトを作成する Perl スクリプトがあります。私は現在、これらのスクリプトのテストを行って書いていますが、実行したいテストの 1 つは、生成されたスクリプトが正常にコンパイルされるかどうかを確認することです (例: perl -c <script>
.) 生成されたスクリプトで Perl にコンパイルを実行させる方法はありますか?別の Perl プロセスを生成する必要なしにスクリプトを実行するには? 答えを探してみましたが、Perl スクリプトを実行可能プログラムにコンパイルする方法に関する情報しか見つかりませんでした。
質問する
470 次
4 に答える
6
スクリプトのコンパイルには多くの副作用があります。これにより、サブが定義されます。モジュールが実行されます。何かがコンパイルされるかどうかを単にテストしたい場合は、別のインタープリターが必要です。1 つのスクリプトをテストすることで、その後のテストで誤検知や誤検知が発生しないようにする唯一の方法です。
于 2012-06-22T21:06:49.280 に答える
3
動的に生成されたコードを実行するには、次のeval
関数を使用します。
my $script = join /\n/, <main::DATA>;
eval($script); # 3
__DATA__
my $a = 1;
my $b = 2;
print $a+$b, "\n";
ただし、構文をコンパイルまたはチェックするだけの場合は、同じ Perl セッション内では実行できません。
syntax_ok
ライブラリTest::Strictの関数は、外部の perl インタープリターで実行perl -c
して構文チェックを実行するため、内部的な方法はないと仮定します。
あなたのために働くかもしれない唯一の回避策は次のとおりです:
my $script = join /\n/, <main::DATA>;
eval('return;' . $script);
warn $@ if $@; # syntax error at (eval 1) line 3, near "1
# my "
__DATA__
my $a = 1
my $b = 2;
print $a+$b, "\n";
この場合、 を使用してコンパイル エラーをチェックできますが$@
、コードの最初の行が であるため、return;
実行されません。
注:有益なチャットとコード修正を提供してくれたユーザーmobに感謝します。
于 2012-06-22T20:41:12.233 に答える
1
このようなものはあなたのために働きませんか?
open(FILE,"perl -c generated_script.pl 2>&1 |");
@output=<FILE>;
if(join('',@output)=~/syntax OK/)
{
printf("No Problem\n");
}
close(FILE);
于 2012-06-22T21:53:15.187 に答える