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