Go to the first, previous, next, last section, table of contents.


流れ制御

Function: goto label
Function: goto &NAME
goto LABEL の形式は、label というラベルの付いた文を探して、 そこへ実行を移すものです。サブルーティンやforeach ループなど、何 らかの初期化が必要な構造の中に入り込むことは許されません。最適化によって なくなってしまう構造の中にも goto することはできません。これ以外 は、サブルーティンの外を含む、動的スコープ内のほとんどすべての場所へ行く ために使用できますが、普通は、lastdie といった別の構造 を使った方が良いでしょう。Perl の作者はこの形式の goto を使う必要 を感じたことは、1 度もありません (Perl では。C は別のお話です)。

goto &NAME の形式は、かなりマジカルなもので、現在実行中のサブルー ティンを、name で指定されたサブルーティンの呼び出しで置き換えます。 これは、AUTOLOAD サブルーティンが別のサブルーティンをロードして、その別 のサブルーティンが最初に呼ばれたようにするために使われます (ただし、現在 のサブルーティンで @_ を修正した場合には、そのその別のサブルーティンに 伝えられます)。goto のあとは、caller() でさえも、現在のサ ブルーティンが最初に呼び出されたと言うことができません。

Function: last label
Function: last
last コマンドは、(ループ内で使った) C の break 文と同じようなもの で、label で指定されるループを即座に抜けます。label が省略さ れると、一番内側のループが対象となります。continue ブロックがあっ ても実行されません:
LINE: while (<STDIN>) {
    last LINE if /^$/;      # ヘッダが終わったら抜ける
    ...
}

Function: next label
Function: next
next コマンドは、C での continue 文のようなもので、ループの次の繰 り返しを開始します:
LINE: while (<STDIN>) {
    next LINE if /^#/;      # コメントを捨てる
    ...
}

continue ブロックが存在すれば、たとえ捨てられる行にあっても、それ が実行されます。label が省略されると、このコマンドは、もっとも内側 のループを参照します。

Function: redo label
Function: redo
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.

検索式: