2012-06-22 37 views
5

Kullanıcı girişini alan ve ileriki bir tarihte çalıştırılacak başka bir komut dosyası oluşturan bir Perl betiğim var. Şu anda bu komut dosyaları için testler yazıyor ve yazıyor ve gerçekleştirmek istediğim testlerden biri, oluşturulan komut dosyasının başarıyla oluşturulup oluşturulmadığını kontrol etmektir (örn. perl -c <script>.) Perl'in bir derleme yapabilmesinin bir yolu var mı? başka bir Perl işlemine sahip olmak zorunda kalmadan oluşturulan komut dosyası? Cevap aramayı denedim, ancak aramalar sadece Perl betiklerini çalıştırılabilir programlara derleme hakkında bilgi veriyor.Çalışan bir Perl oturumunda Perl betiğini nasıl derleyebilirim?

+0

Tam olarak "derleme" ile ne demek istiyorsunuz? Hataları kontrol et Yoksa yürütmek mi? –

+0

@ user1215106 Hataları kontrol edin, aslında çalıştırmayın. Komut dosyasının daha sonra çalıştırıldığında sözdizimi hataları nedeniyle başarısız olmayacağından emin olmak istiyorum. – Joel

+0

Kodu komut dosyanızda dinamik olarak oluşturuyor musunuz? –

cevap

3

, dinamik olarak oluşturulan kodu yürütmek eval işlevini kullanmak için: sadece derlemek veya sözdizimi kontrol etmek istiyorsanız

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

__DATA__ 

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

Ancak o zaman aynı Perl oturum içinde bunu yapmak mümkün olmayacaktır. kütüphaneden Test::Strict den

Fonksiyon syntax_ok harici perl tercüman ile perl -c çalıştırarak bir sözdizimi kontrolü çalıştırmak, bu yüzden hiçbir içsel yolu yoktur varsayalım. işinize yarayabileceğini

Sadece iş çevresinde olacaktır:

Bu durumda
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"; 

, sen derleme hata (lar) [email protected] kullanarak kontrol etmek mümkün olacak ancak çünkü kodunun ilk satırı return;, çalıştırılamaz.


Not: yararlı sohbet ve kod düzeltme kullanıcıya mob teşekkürler.

+1

Bu, yalnızca derlemek değil, kodu derler ve yürütür. – mob

+0

'exit''i değerlendirmek, çağıran programdan çıkacaktır. Belki de 'return' işlevini kullanın veya '(0) {...} ' – mob

+0

' perl -e' eval ("exit 1;/daha geçerli code /;") kodunu yazdırın; "hey ben haklıymışım!" '|| echo 'Ah bekle, sanırım mob haklıydı.' – mob

6

Komut dosyası oluşturmak birçok yan etkiye sahiptir. Sub olarak tanımlanır. Modüllerin yürütülmesi ile sonuçlanır. Eğer bir şey derlediğini test etmek isterseniz, 'u ayrı bir tercüman isteyebilirsiniz. Bir betiğin test edilmesinin, daha sonraki testlerin yanlış pozitif veya yanlış negatifler vermesine yol açmayacağından emin olmanın tek yolu budur.

+0

Son nokta cümlesini netleştirmek için eklendi. Borulama yerine – ikegami

1

Bu çalışma sizin gibi bir şey olmayacak mı?

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

, backtick kullanmak için herhangi bir sebep var mı? –

+0

Seni seviyorum! Çok teşekkür ederim. Bu özel çözüm, özel durumumda gerçekten yardımcı oldu! – gideon