12月 312012
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 | 読み込まれているモジュールの絶対パスの情報 |
参考書籍
【FaceBookでコメント】
Powered by Facebook Comments