読み込まれているモジュールを調べる %INC



  1. Perl




  2. 特殊変数



  3. here

読み込まれているモジュールを調べるには%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関数で、キーだけを取り出してあげます。



  1. Perl




  2. 特殊変数



  3. here

Perlのイベント情報

Perlのイベント情報は、Twitterのモーメントに移行しました。

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

OS名を取得する $^O



  1. Perl




  2. 特殊変数



  3. here

OS名を取得するには$^Oという特殊変数を使用します。

$^O
$^O の値とOSの種類

各OSにおける「$^O」の値をまとめました。

$^Oの値 説明とリンク
MacOS  MacOS
MSWin32 Windows 全般
os2 OS/2
VMS VMS
epoc EPOC OS  (たぶん)
NetWare NetWare
symbian Symbian OS
dos MS-DOS
cygwin cygwin
linux Linux
freebsd FreeBSD
solaris Solaris
Unix ( 違うかも ) Unix
darwin Mac OS X
CentOS Linux



  1. Perl




  2. 特殊変数



  3. here

子プロセスの終了ステータス $?



  1. Perl




  2. 特殊変数



  3. here

子プロセスの終了ステータスを取得するには特殊変数「$?」を使用します。

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

のようになります。



  1. Perl




  2. 特殊変数



  3. here

サブルーチンの引数 @_



  1. Perl




  2. 特殊変数



  3. here

「@_」には、サブルーチンの引数が代入されてきます。

@_

サブルーチンで引数を受け取るには一般的に以下のように記述します。

sub foo {
  # サブルーチンで引数を受け取る
  my ($arg1, $arg2, $arg3) = @_;
}