|
|
Perl関数リファレンス プログラム制御に関する関数 |
H.Kamifuji . |
Perlの組み込み関数の中でプログラムの制御に関する関数のリファレンスです。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 |
|
「exit」関数は実行しているPerlスクリプトを終了します。 exit exitfined([EXPR])実行しているPerlスクリプトを終了します。 パラメータ: EXPR スクリプトが返すステータスコード 戻り値: 1番目の引数にはスクリプトの終了時にスクリプトが返すスタータスコードを指定します。省略された場合はステータスコードとして「0」が使用されます。一般的にプログラムが正常に終了した場合はステータスコードとして「0」を返し、正常ではない終了をした場合は「0」以外の値(例えば「1」)をステータスコードとして返します。 なお「exit」関数が実行された時点でプログラムは終了しますが、特殊なルーチンであるENDルーチンなどは終了前に実行されます。(ENDルーチンとはデストラクタのようなものです)。 具体的には次のように記述します。 exit(0);では簡単なプログラムで確認して見ます。 test1-1.pl サンプルプログラム下記のサンプルを実行してみよう。# exit関数 # use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; while (my $line =上記を「test1-1.pl」の名前で保存してから次のように実行して下さい。 ![]() プログラムを実行すると入力待ちとなります。今回のサンプルではキーボードから入力された値を画面に表示するだけのものです。 ![]() 特定の文字列(今回は「end」)を入力した場合にプログラムが終了します。 ![]() Linux 環境での実行結果は、下記です。シフトJIS で出力されるので nkf -w で UTF-8 に変換しています。 [xxxxxxxx@dddddddddd Control]$ perl test1-1_u.pl | nkf -w test end test 終了します [xxxxxxxx@dddddddddd Control]$パイプラインで実行結果を渡すときにバッファリングのため、表示順がずれてしまう。ここで、下記のようにデフォルトの文字コードで実行するようにプログラムを修正します。 # exit関数 # use strict; use warnings; # use utf8; # デフォルトの文字コードで実行 # binmode STDIN, ':encoding(cp932)'; # binmode STDOUT, ':encoding(cp932)'; # binmode STDERR, ':encoding(cp932)'; while (my $line =実行結果は、下記のように windows と同じ結果になります。 [xxxxxxxx@dddddddddd Control]$ perl test1-1_u.pl test test end 終了します [xxxxxxxx@dddddddddd Control]$ |
「die」関数はエラーが発生した場合にプログラムを終了させる場合に使用し、エラーメッセージを出力しPerlスクリプトを終了します。 die die([LIST])引数に指定した値を標準エラー出力に出力し、実行しているPerlスクリプトを終了します。 パラメータ: LIST 標準エラー出力に出力するリスト 戻り値: 1番目の引数にはエラーとして出力するリストを指定します。エラーを出力後に特殊変数「$!」に格納されているシステムエラーの番号をスタータスコードとして「exit」関数を呼び出して終了します。 もしも「$!」に格納されている値が0の場合には、特殊変数「$?」の値を使い「$>>8」の結果をスタータスコードとして使用します。さらに「$>>8」が0の場合には数値の255を使用します。 具体的には次のように記述します。 die("Error");上記のように引数「LIST」が改行で終わらない場合には、プログラム名と行番号(及び場合によっては入力行)が自動的に表示されます。形式としては「プログラム名 line 行番号」の形式です。 例えば「Error xxx.pl line 15」のように表示されます。 行番号を表示したくない場合には次のように改行で終了して下さい。 die("Error\n");またステータスコードとして使用される特殊変数「$!」はシステムに対する要求を行った時に発生したエラーを保存しています。この変数は数値として扱うとエラーコードを返しますが、文字列として扱うとエラーメッセージを取得できます。 その為、「die」関数の引数の中に「$!」を含めておく事でエラーメッセージを合わせて出力させることが出来ます。 die("Error $!");ただしシステムに対する要求が失敗した時以外で「$!」を参照しても意味のあるメッセージは含まれていませんので注意して下さい。 では簡単なプログラムで確認して見ます。 test2-1.pl サンプルプログラム下記のサンプルを実行してみよう。# die関数 # use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; open(TEST, "test.txt") or die("エラー発生[$!]"); close(TEST);上記を「test2-1.pl」の名前で保存してから次のように実行して下さい。 ![]() ファイルを開こうとして失敗した時に「die」関数が実行されます。自動的にメッセージの最後にプログラム名と行番号が付けられています。 Linux 環境で、シフトJISコード入出力に設定すると die関数で、ハングアップします。ここで、前項と同様にデフォルト文字コードで実行するようにプログラムを修正します。 # die関数 # use strict; use warnings; # use utf8; # デフォルト文字コードで実行 # binmode STDIN, ':encoding(cp932)'; # binmode STDOUT, ':encoding(cp932)'; # binmode STDERR, ':encoding(cp932)'; open(TEST, "test.txt") or die("エラー発生[$!]"); close(TEST);実行結果は、下記のように windows と同等の出力になります。 [xxxxxxxx@dddddddddd Control]$ perl test2-1_u.pl エラー発生[そのようなファイルやディレクトリはありません] at test2-1_u.pl line 10. [xxxxxxxx@dddddddddd Control]$ では今度は「die」関数の引数に指定するリストの最後に改行文字を加えてみます。 test2-2.pl サンプルプログラム下記のサンプルを実行してみよう。# die関数 # use strict; use warnings; use utf8; binmode STDIN, ':encoding(cp932)'; binmode STDOUT, ':encoding(cp932)'; binmode STDERR, ':encoding(cp932)'; open(TEST, "test.txt") or die("エラー発生[$!]\n"); close(TEST);上記を「test2-2.pl」の名前で保存してから次のように実行して下さい。 ![]() このように改行文字が最後にある場合にはプログラム名と行番号が付けられません。 Linux 環境で、シフトJISコード入出力に設定すると die関数で、ハングアップします。ここで、前項と同様にデフォルト文字コードで実行するようにプログラムを修正します。 # die関数 # use strict; use warnings; # use utf8; # デフォルト文字コードで実行 # binmode STDIN, ':encoding(cp932)'; # binmode STDOUT, ':encoding(cp932)'; # binmode STDERR, ':encoding(cp932)'; open(TEST, "test.txt") or die("エラー発生[$!]\n"); close(TEST);実行結果は、下記のように windows と同等の出力になります。 [xxxxxxxx@dddddddddd Control]$ perl test2-1_u.pl エラー発生[そのようなファイルやディレクトリはありません] [xxxxxxxx@dddddddddd Control]$ |
|