2016-04-14 3 views
4

現在、.NETに変換する準備としてPerlスクリプトを文書化しようとしています。今まで私はPerlで以前の経験はありませんでしたが、私は多くのGoogle-fuでそれを乗り越えていました。私はそれが何をしているのか分からないので、私を止めていたコードの一行に遭遇しました。私はそのほとんどを理解することができましたが、作品が欠けていて、それが本当に重要かどうかわかりません。ここでは、コードの行は次のとおりです。eval {}ステートメントのIf()ステートメントの後の空の{}の定義

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

私はdefinedは、彼らがnull/nothing/undefあるかどうかを確認するために、変数$timeEnd$timeStartをチェックしていることを知っています。私はまた、evalブロックがTry/Catchブロックとして使用されていて、例外をトラップしていると考えています。コード行はforeachループ内にありますので、nextキーワードはforeachループの次の繰り返しで引き続き使用されると思います。

私は解読が難しい部分は{};1ビットです。私の理解は、;がPerlの文の区切りであり、バックスラッシュでエスケープされていないため、そこで何が行われているのか分かりません。私はまた、{}の意味を知らない。私は配列と何か関係があると推測しますが、空の配列であり、if()ブロックの直後に何か特別な意味があるかどうかわかりません。最後に、1という単一の整数が意味するものは何も意味しておらず、evalブロックの最後に何をしているのか分かりません。

誰かがそのコード行を個々の部分とその定義に分解することができたら、私はそれを高く評価します。

ボーナス:私に.NET変換を与えることができ、それぞれのPerlビットがどのように関係しているのか、私はインターネットを尊重します。私は私が今知っているものとVB.NETに変換する方法をここにあります:例外が発生した場合

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'と' $ timeEnd'はどこから来ますか? –

+2

{}は 'if'の構文の一部です。真の場合には何もしていないだけです。セミコロンは不要ですが、空文が合法であるため、構文エラーではありません。そのため、1と空文の間を区切ります。全体的に、このステートメントはバグ、不完全、またはその両方に見えます。 – ysth

+0

@ el.pescado、それらは 'XML :: LibXML'のxmlノードです –

答えて

7

に設定されていますelsifelse clasuses、if文の構文を無視すると、次のとおりです。EXPRが真何かに評価された場合

if (EXPR) BLOCK 

ブロックが実行されます。ブロックは、中括弧で囲まれたステートメントのリストで構成されます。コード内の{}は、ifステートメントのブロックです。

ブロックが空(ゼロステートメントのリストを含む)であることは完全に有効です。例えば、

while (s/\s//) { } 

s/\s//g; 

行うのは非効率的な方法であることですが、以下の条件が全く副作用を持っていないので、それはかなり役に立たないです:

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

それは例外を投げることさえできません! [1]だから

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

# Nothing to see here... 
に相当する[2]

1 or next; 

と等価である

eval { 1 } or next; 

と等価です


  1. 技術的には、変数が魔法の場合には可能です。

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

    私はこのことを確認することを意図していません。

  2. 技術的には、[email protected]もクリアします。

+1

セミコロンに関しては、それは余分な空文です。たとえば、 'perl -E '$ _ =" abc ";;;;;;" perl -E' $ _ = "abc";と言うのは奇妙な方法です。 – ikegami

2

eval{}戻り、最後のexpresion(あなたの例では1)またはundefの結果。あなたは、返される値はミニプログラムの内部で評価され、最後の式の値..ですperldoc -f eval

から

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

、同じコードを書くことができます。サブルーチンと同様に、return文を使用することもできます。

が構文エラーまたは実行時エラーがある、またはダイ文が実行される場合は、スカラーコンテキストかリストコンテキストでは空リストではundefのeval戻り、$ @にエラーメッセージ

+0

速い応答に感謝します。したがって、基本的にevalステートメントは常に1の値を返すので価値がありません。空の '{} 'が' if() 'ステートメントの後に何を意味するかを詳しく説明できますか?最後に、 '$ ok or next'(あなたの例では)は、コード行が入っている' foreach'ループのコンテキストで何を意味していますか?それは常にループの次の繰り返しに進むでしょうか? –

+0

空の '{}'は空のブロックです。 –

+1

'1'は' eval'を無意味にしません。 'eval'が正常に終了すると、最後の式が返されます(その場合は' 1')。例外が発生した場合、 'undef'が返されます。したがって、 '1'は成功したときに真実の値が' eval'から返されることを保証することです。 –

関連する問題