プログラムを終了する
exit
は EXPR を評価し、その値で即座に終了します。
次の例は、シェルで x または X を入力後にエンターキーを押したら、
終了コード 0
(正常終了) でスクリプトを終了します。
そうでなければ、終了コード 1
(異常終了) でスクリプトを終了します。
my $ans = <STDIN>;
if ( $ans =~ /^[Xx]/ ) {
exit 0; # x または X を入力してエンターキーを押したら正常終了
}
else {
exit 1; # そうでなければ異常終了
}
die
の解説もご覧ください。
EXPR が省略されると 0
ステータスで終了します。
EXPR の値のうち、成功を意味する 0
と失敗を意味する 1
だけはどこでも通用するのですが、それ以外の値は、Perl プログラムが実行している環境ごとに解釈されることになっています。
たとえば、メーラーは、sendmail
のメール入力フィルターの 69 (EX_UNAVAILABLE) による終了を受けると、
配信できなかった項目を返すことになるでしょうが、どこでもそうであるとは限りません。
Linux のシェルの場合、前述のサンプルを実行後に echo $?
を実行すると、終了コードを確認することができます。
$ perl ./sample.pl
x
$ echo $?
0
Windows の PowerShell でも echo $?
が利用できます。
ただし、Linux とは異なり、正常終了か異常終了かの違いしか認識できません。
終了コードが 0 なら True、それ以外のコードなら False と出力されます。
> perl ./sample.pl
x
> echo $?
True
誰かがどんなエラーでも補足したいと考える可能性が少しでもあるなら、exit
でサブルーチンを中止してはいけません。
その場合は die
を使って、eval
で捕捉できるようにしてください。
exit
関数は必ずしも即座に終了するわけではありません。
END
ルーチンがあればそれを最初に呼び出します。
しかし、そのような END
ルーチンはその終了を中止することはできません。
同様に、呼び出される必要があるオブジェクトのディストラクタがあれば、実際の終了の前に呼び出されます。
END
ルーチンとデストラクタは、$? を変更することで終了ステータスを変更することができます。
これが問題であれば、
POSIX::_exit($status)
を呼び出すことで、END
とデストラクタの処理を避けることができます。
詳細は perlmod をご覧ください。