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.