[perl] 特殊変数 @INC %INC について (その他特殊変数について)


Perlはなんか特殊な変数が多くて大変です。。。とくにINC変数は特に重要というかCPANモジュールなどを入れるときや自分で定義したモジュールを読み込むなどで意識することがとても多くなるので、ちょっとまとめてみたいと思います。

@INC %INC の 説明

  • @INC … モジュールの検索パス(JavaでいうClassPathと同じ)
  • %INC … 読み込まれているモジュールの情報。ハッシュ形式でモジュールまでの絶対パスが格納される。

内容を確認する

次のようなコードで@INC, %INCをデバッグ出力してみる。
test.pl ( perl test.pl とコマンドを実行 )

use strict;
use warnings;
use DDP;

p @INC;
p %INC;

実行結果は以下のようになる。

■「p @INC;」の部分の実行結果。配列形式でモジュールの検索パスが格納されている。

[
    [0] "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level",
    [1] "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2",
    [2] "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/darwin-2level",
    [3] "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2",
    [4] "."
]

■「p %INC;」の部分の実行結果。以下のようなハッシュ。
* key => パッケージが「package Hoge::Fuga」のようなFuga.pmモジュールの場合、
Hoge/Fuga.pmというキーとなる。
* value => 上記キーのファイルの絶対パスがバリューとなる。

{
    base.pm                                        "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/base.pm",
    B.pm                                           "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/darwin-2level/B.pm",
    bytes.pm                                       "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/bytes.pm",
    Carp/Heavy.pm                                  "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/Carp/Heavy.pm",
    Carp.pm                                        "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/Carp.pm",
    Class/Load.pm                                  "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/Class/Load.pm",
    Class/Load/XS.pm                               "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level/Class/Load/XS.pm",
    Class/MOP.pm                                   "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level/Class/MOP.pm",
    Class/MOP/Attribute.pm                         "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level/Class/MOP/Attribute.pm",
    Class/MOP/Class.pm                             "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level/Class/MOP/Class.pm",
    Class/MOP/Class/Immutable/Trait.pm             "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/site_perl/5.16.2/darwin-2level/Class/MOP/Class/Immutable/Trait.pm",
・・・
・・・
省略
    unicore/Heavy.pl                               "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/unicore/Heavy.pl",
    unicore/lib/Perl/_PerlIDS.pl                   "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/unicore/lib/Perl/_PerlIDS.pl",
    utf8_heavy.pl                                  "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/utf8_heavy.pl",
    utf8.pm                                        "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/utf8.pm",
    vars.pm                                        "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/vars.pm",
    version.pm                                     "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/version.pm",
    warnings.pm                                    "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/warnings.pm",
    warnings/register.pm                           "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/warnings/register.pm",
    XSLoader.pm                                    "$HOME/perl5/perlbrew/perls/perl-5.16.2/lib/5.16.2/XSLoader.pm"
}

余談

perlコマンドでperlスクリプトを実行する場合。実行時に@INCを追加することが出来る。

% perl -I[@INCに追加したいパス] test.pl


その他の特殊変数

特殊変数 意味
$. 読み込んでいるファイルの行番号
$$ プロセスID
$> 実行ユーザID
$] 実行グループID
$0 実行しているプログラム名
$^O OS名
$^T プログラムが起動した時刻
%ENV 環境変数($ENV{“Path”} という形で環境変数のPathを抽出する)
%SIG シグナルハンドラ
@ARGV コマンドライン引数
@_ サブルーチンの引数
$! OSのエラー
$@ 最後に実行した eval のエラー
@INC モジュールの検索パス
%INC 読み込まれているモジュールの絶対パスの情報

参考書籍

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です