2016-04-14 7 views
4

Şu anda bir Perl komut dosyasını .NET'e dönüştürmek üzere hazırlamaya çalışıyorum. Önceden Perl'de daha önce hiç tecrübem yok, ancak bir çok Google-fu ile başa çıkmayı başarabiliyordum. Ne yaptığından emin olmadığım için beni durduran tek bir kod satırına girdim. Çoğu şeyi anlayabildim, ama bir parçayı kaçırdım ve gerçekten bu kadar önemli olup olmadığını bilmiyorum.{} ifadesindeki ifade {} ifadesinden sonra {} ifadesinin boş bırakılması {} deyiminde

eval { if(defined $timeEnd && defined $timeStart){}; 1 } or next; 

Ben defined onlar null/nothing/undef olup olmadığını görmek için değişkenleri $timeEnd ve $timeStart kontrol olduğunu biliyoruz: İşte kod çizgidir. Ayrıca, tüm özel durumları yakalamak için eval bloğunun Try/Catch bloğu olarak kullanıldığına inanıyorum. Kod satırı foreach döngüsündedir, dolayısıyla anahtar sözcüğünün foreach döngüsünün sonraki yinelemesine devam edeceğine inanıyorum.

Deşifre etmekte zorlandığım kısım {};1 bittir. Anladığım kadarıyla, ;, Perl'de bir ifade ayırıcısıdır ve bir ters eğik çizgi ile kaçmadığından, orada ne yaptığını bilmiyorum. Ayrıca {}'un ne anlama geldiğini de bilmiyorum. Bir dizi ile ilgili bir şey olduğunu varsayalım, ama boş bir dizi olurdu ve bir if() bloğundan hemen sonra özel bir şey ifade edip etmediğini bilmiyorum. Son olarak, 1 tek bir tam sayısının eval bloğun sonunda ne anlama geldiğini ve orada ne yaptığını bilmiyorum.

Birisi bu kod satırını tek tek parçalara ve tanımlarına ayırabilirse, bunu takdir ediyorum.

Bonus: Bana bir .NET dönüşümü ve her bir Perl bitinin bununla nasıl ilişkili olduğunu söylerseniz, size kesinlikle internet saygılarımı sunacağım. İşte artık bildiklerini ile VB.NET dönüştürmek gibi olacaktır: bir istisna olmadığını

For each element in xmlList 'This isn't in the Perl code I posted, but it's the `foreach` loop that the code resides in. 
    Try 
     If Not IsNothing(timeEnd) AND Not IsNothing(timeStart) then 
     End If 
    Catch ex as Exception 
     Continue For 
    End Try 
Next 
+0

$ timeStart' ve '$ timeEnd' nereden geliyor? –

+2

{}, 'if' sözdiziminin bir parçasıdır; Sadece gerçek durumda hiçbir şey yapmıyor. Noktalı virgül gereksizdir, ancak boş bir deyim yasal olduğu için bir sözdizimi hatası değildir, bu nedenle 1 ile boş bir deyim arasında if. Genel olarak, bu ifade buggy veya eksik veya her ikisi de görünüyor. el.pescado @ – ysth

+0

, onlar 'XML :: LibXML' –

cevap

7

olarak ayarlanırsa elsif ve else clasuses, bir if ifadesinin sözdizimi göz ardı edilmesi şudur: IFADE gerçek bir şey olarak değerlendirilirse

if (EXPR) BLOCK 

blok yürütülür. Bir blok, kaşlı ayraçlardaki ifadelerin bir listesinden oluşur. Kodunuzdaki {}, if ifadesinin bloğudur.

Blokların boş olması (sıfır ifadelerinin bir listesini içermek) için kesinlikle geçerlidir.Örneğin,

while (s/\s//) { } 

s/\s//g; 

yapmanın verimsiz bir yoludur şeydir, aşağıdaki koşul hiçbir yan etkisi vardır, bu yüzden oldukça yararsız:

if(defined $timeEnd && defined $timeStart){} 

Bir istisna bile atamıyor! [1] Böylece

eval { if(defined $timeEnd && defined $timeStart){}; 1 } or next; 

eşdeğerdir

eval { 1 } or next; 

eşdeğerdir [2]

# Nothing to see here... 
eşdeğerdir

1 or next; 

  1. Teknik olarak değişkenler büyülü ise teknik olarak kullanılabilir.

    $ perl -MTie::Scalar -e' 
        our @ISA = "Tie::StdScalar"; 
        tie(my $x, __PACKAGE__); 
        sub FETCH { die } 
        defined($x) 
    ' 
    Died at -e line 4. 
    

    Amacım bunun kontrol edilmesi gerektiğinden şüphe duyuyorum. Teknik olarak, [email protected]'u da temizler.

+1

olduğunu. Yarı-kolon için olduğu gibi gereksiz boş bir açıklama. Örneğin, 'perl -E' $ _ = "abc" ;;;;;; '' tuhaf bir yazma yoludur '' perl -E '$ _ =' abc '' demek ''. – ikegami

2

eval{} döner geçen (sizin örnekte 1) anlatımda veya undef arasında sonuçlanır. Sen döndürülen değer mini programı içinde değerlendirilen son ifadenin değeridir perldoc -f eval

.. Gönderen

my $ok = eval { 
    if (defined $timeEnd && defined $timeStart){}; 
    1 
}; 
$ok or next; 

, aynı kodu yazabilirsiniz; Alt raporlarda olduğu gibi bir dönüş ifadesi de kullanılabilir.

orada sözdizimi hatası veya çalışma zamanı hata varsa veya eval döner sayıl bağlam veya liste bağlamında boş listesinde undef, bir kalıp deyimi yürütüldüğünde ve $ @ hata mesajı

+0

Hızlı yanıt için teşekkürler. Öyleyse, temel olarak eval ifadesi değersizdir, çünkü her zaman 1 değerini döndürür? 'If() 'ifadesinden sonra boş olanı {} içeren şeyin ayrıntılarını açabilir misiniz? Son olarak, kodun satırında yer alan "foreach" döngüsünün bağlamında ne anlama geliyor? Döngünün her zaman iterasyonuna devam edecek mi? –

+0

Empty '{}' sadece boş blok. –

+1

'1'' eval' değersiz yapmaz. “Eval” başarılı bir şekilde tamamlandığında, son ifade döndürülür (bu durumda '' 1). Özel durum kaldırılırsa, 'undef' döndürülür. Yani, '' 1 'başarıdan' gerçek değer 'döndürüldüğünden emin olmaktır. –