読み込まれているモジュールを調べる %INC
読み込まれているモジュールを調べるには%INCという特殊変数を使います。
%INC
%INC ハッシュは、モジュール名とモジュールのファイル名の組み合わせが、代入されています。モジュール名と、実際にどのファイルをインポートしたのかがわかります。Data::Dumperで出力した結果は以下のようになっています。
$VAR1 = { 'Data/Dumper.pm' => 'C:/Strawberry/perl/lib/Data/Dumper.pm', 'XSLoader.pm' => 'C:/Strawberry/perl/lib/XSLoader.pm', 'feature.pm' => 'C:/Strawberry/perl/lib/feature.pm', 'Carp.pm' => 'C:/Strawberry/perl/lib/Carp.pm', 'warnings.pm' => 'C:/Strawberry/perl/lib/warnings.pm', 'bytes.pm' => 'C:/Strawberry/perl/lib/bytes.pm', 'strict.pm' => 'C:/Strawberry/perl/lib/strict.pm', 'Exporter.pm' => 'C:/Strawberry/perl/lib/Exporter.pm', 'warnings/register.pm' => 'C:/Strawberry/perl/lib/warnings/register.pm', 'constant.pm' => 'C:/Strawberry/perl/lib/constant.pm' };
%INCはモジュールの検索パスが格納されている、 @INC とは何の関係もありません。@INC と %INC はまったく別の変数です。モジュール名だけを知りたい場合は、keys関数で、キーだけを取り出してあげます。
Perlのイベント情報
Perlのイベント情報は、Twitterのモーメントに移行しました。
2018年
8月25日(土) | Perl入学式 in 沖縄 第4回 〜サブルーチン/正規表現編〜 |
---|---|
9月8日(土) | Perl入学式 in大阪 第3回 〜配列/ハッシュ編〜 |
9月14日(金) | 六本木.pm (株式会社メルカリ 六本木ヒルズ森タワー18F) |
9月15日(土) | Perl入学式 in札幌 第2回 〜構文基礎編〜 |
2019年の年始 | YAPC 東京 2018 |
終了したイベント
2018年
6月3日(日) | Mishima.pm #3 (静岡県三島市) |
---|---|
6月9日(土) | なにわPerl(なにわPerl#14) |
6月11日(月) | Gotanda.pm Perl Technology Conference #18 (六本木編) |
6月16日(土) | Perl入学式 in東京 第三回 配列/ハッシュ編 |
6月23日(土) | 北海道.pm #14 |
6月23日(土) | Perl入学式 in沖縄 第2回 構文基礎編 |
7月5日(木) | Shibuya Perl Mongersテクニカルトーク#18 |
7月7日(土) | Perl入学式 in沖縄 第2.5回 〜いままでの復習会〜 |
7月14日(土) | Perl入学式 in札幌 第1回 環境構築編 |
7月14日(土) | Perl入学式 in福岡 第2回 〜構文基礎編〜 |
7月21日(土) | Perl入学式 in東京 第4回 〜サブルーチン/正規表現編〜 |
7月21日(土) | Perl入学式 in 沖縄 第3回 〜配列/ハッシュ/リファレンス編〜 |
7月27日(金) | 吉祥寺.pm15 |
8月4日(土) | Perl入学式 in大阪 第2回 〜構文基礎編〜 |
OS名を取得する $^O
OS名を取得するには$^Oという特殊変数を使用します。
$^O
子プロセスの終了ステータス $?
子プロセスの終了ステータスを取得するには特殊変数「$?」を使用します。
waitで子プロセスの終了を待った]場合は、$?に子プロセスの終了ステータスを含めた複数の値が格納されます。またsystem関数を使って子プロセスを実行した場合にも$?が設定されます。
$?の解釈の方法はやや複雑です。$?には16ビットの値が設定されます。上位8ビットに子プロセスの終了ステータスが設定されます。下位8ビットの8ビット目には、コアダンプが生成されたかどうかを表します。下位8ビットの7ビット目までは、もしあればプロセスを終了させたシグナルの番号を表します。
|----------------------+----+------------------| | 8 | 1 | 7 | |----------------------+----+------------------| | | | 終了ステータス コアダンプの 子プロセスを終了させたシグナル 発生
ですので、終了ステータスを取得するためには、$?を8ビット右にシフトさせる必要があります。
# 終了ステータスの取得 my $exit_value = $? >> 8;
コアダンプが発生したかどうかを見るには
# コアダンプが発生したかどうか my $dumped_core = $? & 128;
とします。128は2進数になおすと 10000000 ですので、ビット積をとると8ビット目以外が0になります。子プロセスを終了させたシグナル番号を見るには
# 子プロセスを終了させたシグナル番号 my $signal_num = $? & 127;
とします。127は2進数で、01111111 ですので、ビット積をとると下位7ビットが取得できます。
子プロセスが終了したかどうかを調べる
wait関数はCHLDシグナルが発生すると制御を戻します。つまり、子プロセスが終了したときだけではなく、子プロセスが停止したり、再開したりした場合にも制御が戻るということです。
子プロセスが確実に終了したかどうかを調べるには、WIFEXITED 関数を使用します。
use POSIX q(:sys_wait_h); my $is_finished = WIFEXITED($?);
子プロセスの終了ステータスを見るサンプル
子プロセスの中でdieを呼んだので終了ステータスは255になります。親プロセスがこのステータスを取得できているのがわかると思います。
use strict; use warnings; use POSIX qw(:sys_wait_h); my $pid = fork; die "Cannot fork: $!" unless defined $pid; if ($pid) { # 子プロセスの終了を待機する。 wait; print "親プロセス( 子プロセスID: $pid )\n\n"; my $exit_value = $? >> 8; my $dumped_core = $? & 128; my $signal_num = $? & 127; my $is_finished = WIFEXITED( $? ); print "子プロセスの終了コード: $exit_value\n"; print "コアダンプが発生したかどうか : $dumped_core\n"; print "子プロセスを終了させたシグナル : $signal_num\n"; print "子プロセスが終了したかどうか : $is_finished\n"; } else { # 子プロセスで2秒待つ sleep 2; print "子プロセス\n"; die; }
実行結果は
子プロセス Died at c.pl line 29. 親プロセス(子プロセスID: 13830) 子プロセスの終了コード: 255 コアダンプが発生したかどうか : 0 子プロセスを終了させたシグナル : 0 子プロセスが終了したかどうか : 1
のようになります。