goto LABEL
の形式は、label というラベルの付いた文を探して、
そこへ実行を移すものです。サブルーティンやforeach
ループなど、何
らかの初期化が必要な構造の中に入り込むことは許されません。最適化によって
なくなってしまう構造の中にも goto
することはできません。これ以外
は、サブルーティンの外を含む、動的スコープ内のほとんどすべての場所へ行く
ために使用できますが、普通は、last
や die
といった別の構造
を使った方が良いでしょう。Perl の作者はこの形式の goto
を使う必要
を感じたことは、1 度もありません (Perl では。C は別のお話です)。
goto &NAME
の形式は、かなりマジカルなもので、現在実行中のサブルー
ティンを、name で指定されたサブルーティンの呼び出しで置き換えます。
これは、AUTOLOAD サブルーティンが別のサブルーティンをロードして、その別
のサブルーティンが最初に呼ばれたようにするために使われます (ただし、現在
のサブルーティンで @_ を修正した場合には、そのその別のサブルーティンに
伝えられます)。goto
のあとは、caller()
でさえも、現在のサ
ブルーティンが最初に呼び出されたと言うことができません。
last
コマンドは、(ループ内で使った) C の break 文と同じようなもの
で、label で指定されるループを即座に抜けます。label が省略さ
れると、一番内側のループが対象となります。continue
ブロックがあっ
ても実行されません:
LINE: while (<STDIN>) { last LINE if /^$/; # ヘッダが終わったら抜ける ... }
next
コマンドは、C での continue 文のようなもので、ループの次の繰
り返しを開始します:
LINE: while (<STDIN>) { next LINE if /^#/; # コメントを捨てる ... }
continue
ブロックが存在すれば、たとえ捨てられる行にあっても、それ
が実行されます。label が省略されると、このコマンドは、もっとも内側
のループを参照します。
redo
は、条件を再評価しないで、ループブロックの始めからもう一度実
行を開始します。continue
ブロックがあっても、実行されません。
label が省略されると、このコマンドは、もっとも内側のループを参照し
ます。このコマンドは通常、自分への入力を欺くために使用します:
# 単純な Pascal のコメント除去プログラム # (警告: 文字列中には { や } がないと仮定) LINE: while (<STDIN>) { while (s|({.*}.*){.*}|$1 |) {} s|{.*}| |; if (s|{.*| |) { $front = $_; while (<STDIN>) { if (/}/) { # コメントの終わり s|^|$front{|; redo LINE; } } } print; }
Go to the first, previous, next, last section, table of contents.