分かりやすく、使いやすく。

初期処理、終了処理を定義する方法

スポンサーリンク

Perl では BEGIN, UNITCHECK, CHECK, INIT, END を使用することで、コード読み込み時や終了直前に自動的に実行される内容を定義することができます。

これらが実行されるタイミングは次の通りです。

ルーチン 実行タイミング
BEGIN 読み込んだ瞬間に即実行されます。
全体がコンパイルされていなくてもBEGINが読み込まれたら即実行されるため、BEGINより後のコードでコンパイルエラーが発生しても、BEGINの内容は実行されます。
UNITCHECK 定義されたコンパイル単位がコンパイルされた直後に実行されます。
CHECK 最初の Perl コンパイルフェーズ終了直後、実行が開始する直前に実行されます。
INIT Perl ランタイムが実行を開始する直前に実行されます。
END perl がプログラムの実行を終えた後、 インタプリタが終了する直前に実行されます。

もっと詳しく知りたい場合はperldocのperlmodのページを参照してください。

実際にコードで試してみると、次のように実行されます。

perl(実行可能なサンプルコード)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use strict;
 
BEGIN{
  print "BEGINが実行されました\n";
}
 
UNITCHECK{
  print "UNITCHECKが実行されました\n";
}
 
CHECK{
  print "CHECKが実行されました\n";
}
 
INIT{
  print "INITが実行されました\n";
}
 
END{
  print "ENDが実行されました\n";
}
 
print "メイン処理が実行されました\n"; 
BEGINが実行されました
UNITCHECKが実行されました
CHECKが実行されました
INITが実行されました
メイン処理が実行されました
ENDが実行されました 

パッケージの場合

パッケージを use した場合、 import も暗黙で実行されます。 import と BEGIN, UNITCHECK, CHECK, INIT, END の実行順を実際にテストしてみると次のようになります。

test.pl
1
2
3
use strict;
 
use MyModule; 
MyModule.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package MyModule;
 
use strict;
 
BEGIN{
  print "BEGINが実行されました\n";
}
 
UNITCHECK{
  print "UNITCHECKが実行されました\n";
}
 
CHECK{
  print "CHECKが実行されました\n";
}
 
INIT{
  print "INITが実行されました\n";
}
 
END{
  print "ENDが実行されました\n";
}
 
sub import{
  print "importが実行されました\n";
}
 
print "メイン処理が実行されました\n";
 
1; 

上記の test.pl を実行した結果は次の通りです。

BEGINが実行されました
UNITCHECKが実行されました
メイン処理が実行されました
importが実行されました
CHECKが実行されました
INITが実行されました
ENDが実行されました 
スポンサーリンク