2. Perl6-変数の操作、匿名ブロック
3. Perl6-条件付きステートメント、ループ
4. Perl6-関数を使用する
5. Perl6-クラス
6. Perl6-I / Oモジュール
7. Perl6-コメント、空白、括弧
8. Perl6-演算子のオーバーロード
9. Perl6-データ型の操作
10. Perl6-例外処理
前回の記事では、特別なネストされたCATCHブロックで発生した例外のキャッチについて説明しました。 実際、このブロックは特別な種類です-フェイザー(この単語を翻訳することはできません)。 フェイザーは、特定の条件下で実行される特別なネストされたブロックです。 それらを調理するものを使用すると、カットの下に表示されます。
Phaser'ovの主な代表者について考えてみましょう。
- BEGIN {...} *
このブロックは、アプリケーションのコンパイル時に1回実行され、最後に計算された結果(将来的にアスタリスクでマークされたブロックの場合)は、変数を割り当てるための結果として使用できます。
say "Test say"; my $block = BEGIN { say "Compile say"; "Compile time " ~ now; } say $block;
この場合、コンパイル時間を反映するブロックがブロック変数に割り当てられます(さらに、私が理解しているように、ブロック自体はコンパイル中に実行され、スクリプトが実行されると、変数には既に計算値が割り当てられます)。
その結果、画面に次のように表示されます。
Compile say Test say Compile time Instant:1377026323.088
さらに、BEGINブロック内で例外が発生した場合:
say "Test say"; my $block = BEGIN { die "Compile die"; "Compile time " ~ now; } say $block;
次に、画面には「Test say」という碑文は表示されませんが、すぐに「Compile die」が表示されますが、出力はBEGINブロックの結果の割り当てよりも早く発生します。
さて、このブロックの最後の例は、疑念を払拭します。
say "Test say"; BEGIN { say "Compile say"; } say "Test say 2"; BEGIN { say "Compile say 2"; }
その結果、画面に次のように表示されます。
Compile say Compile say 2 Test say Test say 2
- チェック{...} *
前のものと似ていますが、アクションはコンパイル後、スクリプト自体の前に実行されますが、コードで逆の順序で気づいたように:
say "Test say"; BEGIN { say "Compile say"; } CHECK { say "Check say"; } say "Test say 2"; BEGIN { say "Compile say 2"; } CHECK { say "Check say 2"; }
その結果、画面に次のように表示されます。
Compile say Compile say 2 Check say 2 Check say Test say Test say 2
- INIT {...} *
このブロックは、スクリプトの実行時に実行されます。
say "Test say"; BEGIN { say "Compile say"; } CHECK { say "Check say"; } INIT { say "Init say"; } say "Test say 2"; BEGIN { say "Compile say 2"; } CHECK { say "Check say 2"; } INIT { say "Init say 2"; }
その結果、結論は次のとおりです。
Compile say Compile say 2 Check say 2 Check say Init say Init say 2 Test say Test say 2
- END {...}
ブロックは、スクリプトが停止したときに実行されます。 CHECKの場合と同じ方法で実行され、スクリプトで検出されたのと逆の順序で実行されること、およびスクリプトで例外が発生した場合でもこのブロックが実行されることに注意してください。
say "Test say"; BEGIN { say "Compile say"; } CHECK { say "Check say"; } INIT { say "Init say"; } END { say "End say"; } say "Test say 2"; BEGIN { say "Compile say 2"; } CHECK { say "Check say 2"; } INIT { say "Init say 2"; } END { say "End say 2"; } die "test die";
その結果、画面に次のように表示されます。
Compile say Compile say 2 Check say 2 Check say Init say Init say 2 Test say Test say 2 test die in block at bla\bla\bla\perl.p6:37 End say 2 End say
- ENTER {...} *
このブロックは、ENTERブロックが埋め込まれているブロックの実行中に実行されます。
loop (my $i=0; $i <4; $i++) { ENTER { say $i; } say "Another loop entry"; } ENTER { say "Test Enter"; }
このスクリプトの出力:
Test Enter 0 Another loop entry 1 Another loop entry 2 Another loop entry 3 Another loop entry
また、Phaserブロックを相互にネストできることにも注意してください。
- 立ち去る{...}
LEAVEがネストされたブロックが完了すると実行されます。 ここで、ここで私は再び問題に直面しました。そのため、前回の研究を延期しました-間違った場所に間違ったスペースを置くと、再び明確なエラーを受け取り始めました。 そして、LEAVEブロックを使用した例は、単にコンパイルしなかったため、returnステートメントのパラメーターの数が間違っているというエラーを通知しました。 しかし、例を挙げます。
loop (my $i=0; $i <4; $i++) { LEAVE { say "Test leave"; } say "Another loop entry"; }
突然誰かがこれをコンパイルできるなら、コメントで教えてください。
後でわかったように、ブロックの終了に関連する部分は機能しません。 しかし、先に進みましょう:
- KEEP {...}
このブロックは、ブロック全体が正常に実行されると実行されます(このようなブロックを使用するスクリプトはコンパイルされていないため、成功の判定方法を確認できませんでした)。
- 元に戻す{...}
前のブロックと同様ですが、実行が正常に完了しなかった場合。 サンプルもコンパイルしません。
- 最初の{...} *
このブロックは、FIRSTが埋め込まれているブロックの最初の開始時にのみ実行されます。
loop (my $i=0; $i <4; $i++) { FIRST {say "Test keep";} say "Another loop entry"; }
したがって、結論:
Test keep Another loop entry Another loop entry Another loop entry Another loop entry
また、別のリストに、小文字で記述されたPhasersのように動作する演算子が表示されます。
- {...} *
ブロック内のすべての操作を実行し、結果を用語の形式で表示します。 使用例:
if ( do {my $a = 10; $a = $a*2;} == 20) { say "It's ok"; }
したがって、計算をifブロック内に埋め込み、doブロック自体を比較に使用できます。 もちろん、この例は指にとっては非常に悪いものです(そのために定規を付けることもできます)が、なぜ使用できるのかを示すために、この例は機能します。
- 一度{...} *
このブロックは一度だけ実行する必要があります。 残念ながら、サンプルをコンパイルしていないため、検証できませんでした。
my $i = once { say "Test once"; }; $i(); $i(); $i();
&once関数が見つからなかったことを訴えます。
- {...}を試してください*
前の記事からおなじみのブロックで、すべての例外を無視します。
- 怠zyな{...} *
説明によると、履行の「約束」を返す必要があります。 残念ながら、その結果は「1回」ブロックの場合と同じです。 私が理解しているように、このブロックは「レイジーコンピューティング」の整理に役立つはずです。
- 非同期{...}
新しいスレッドでブロックを実行します。 残念ながら、ここでも例をコンパイルできませんでした。 しかし、フローの処理がどのように発生するかについては、今考えています。
さて、おそらくそれは終了する時です。 どういうわけか、例のために長い投稿でさえ判明しましたが、楽しんでいただければ幸いです。