INC変数とシンボルテーブルとglob
仕事で実行中のスクリプトが読み込んでいるmoduleを確認する必要があり、いろいろ調べているうちにタイトルにつけたようなものに辿り着いたので、整理してまとめておく。
INC変数
@INC, %INCと呼ばれる変数で、以下の値を取得することが出来る。
- @INC : モジュールの検索パス。
- %INC : 読み込まれているモジュールの情報。
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; warn Dumper @INC; warn Dumper \%INC;
$ perl hoge.pl
# @INC
$VAR1 = '/Library/Perl/5.16/darwin-thread-multi-2level';
$VAR2 = '/Library/Perl/5.16';
$VAR3 = '/Network/Library/Perl/5.16/darwin-thread-multi-2level';
$VAR4 = '/Network/Library/Perl/5.16';
$VAR5 = '/Library/Perl/Updates/5.16.2';
$VAR6 = '/System/Library/Perl/5.16/darwin-thread-multi-2level';
$VAR7 = '/System/Library/Perl/5.16';
$VAR8 = '/System/Library/Perl/Extras/5.16/darwin-thread-multi-2level';
$VAR9 = '/System/Library/Perl/Extras/5.16';
# %INC
$VAR1 = {
'warnings/register.pm' => '/System/Library/Perl/5.16/warnings/register.pm',
'XSLoader.pm' => '/System/Library/Perl/5.16/XSLoader.pm',
'unicore/lib/Perl/_PerlIDS.pl' => '/System/Library/Perl/5.16/unicore/lib/Perl/_PerlIDS.pl',
'unicore/Heavy.pl' => '/System/Library/Perl/5.16/unicore/Heavy.pl',
'warnings.pm' => '/System/Library/Perl/5.16/warnings.pm',
'utf8.pm' => '/System/Library/Perl/5.16/utf8.pm',
'overloading.pm' => '/System/Library/Perl/5.16/overloading.pm',
'Carp.pm' => '/System/Library/Perl/5.16/Carp.pm',
'bytes.pm' => '/System/Library/Perl/5.16/bytes.pm',
'utf8_heavy.pl' => '/System/Library/Perl/5.16/utf8_heavy.pl',
'strict.pm' => '/System/Library/Perl/5.16/strict.pm',
'Exporter.pm' => '/System/Library/Perl/5.16/Exporter.pm',
'vars.pm' => '/System/Library/Perl/5.16/vars.pm',
'constant.pm' => '/System/Library/Perl/5.16/constant.pm',
'overload.pm' => '/System/Library/Perl/5.16/overload.pm',
'Data/Dumper.pm' => '/System/Library/Perl/5.16/darwin-thread-multi-2level/Data/Dumper.pm'
};
参考ページ:[perl] 特殊変数 @INC %INC について (その他特殊変数について)
シンボルテーブル
詳しい解説は以下のページにある。
perlmod - Perl のモジュール (パッケージとシンボルテーブル) - perldoc.jp
パッケージのシンボルテーブルは、パッケージ名に二つのコロンを付けた名前の ハッシュに蓄えられます。 つまり、main のシンボルテーブルは %main::、または短く %:: となります。 同様に、先に述べたネストしたパッケージは %OUTER::INNER:: となります。
パッケージ名を明確に宣言しない場合はmainパッケージに属することになる。このことから、mainパッケージのシンボルテーブルを参照することで、実行中のplスクリプトが参照しているmoduleを確認することが出来るものと思われる。
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; warn Dumper \%main::;
$VAR1 = {
'version::' => *{'::version::'},
'/' => *{'::/'},
'stderr' => *::stderr,
'SIG' => *::SIG,
',' => *{'::,'},
'utf8::' => *{'::utf8::'},
'"' => *{'::"'},
'constant::' => *{'::constant::'},
're::' => *{'::re::'},
'DynaLoader::' => *{'::DynaLoader::'},
'mro::' => *{'::mro::'},
'strict::' => *{'::strict::'},
'stdout' => *::stdout,
'' => *{'::'},
'overloading::' => *{'::overloading::'},
'|' => *{'::|'},
'Regexp::' => *{'::Regexp::'},
'UNIVERSAL::' => *{'::UNIVERSAL::'},
'overload::' => *{'::overload::'},
'E_TRIE_MAXBUF' => *{'::E_TRIE_MAXBUF'},
'Data::' => *{'::Data::'},
'_<perlmain.c' => *{'::_<perlmain.c'},
'_<universal.c' => *{'::_<universal.c'},
'BEGIN' => *::BEGIN,
'!' => *{'::!'},
'IO::' => *{'::IO::'},
'' => *{'::'},
'_' => *::_,
'Exporter::' => *{'::Exporter::'},
'Internals::' => *{'::Internals::'},
'STDIN' => *::STDIN,
'warnings::' => *{'::warnings::'},
'DB::' => *{'::DB::'},
'_<perl.c' => *{'::_<perl.c'},
'2' => *{'::2'},
'_<mro.c' => *{'::_<mro.c'},
'1' => *{'::1'},
'ARNING_BITS' => *{'::ARNING_BITS'},
'CORE::' => *{'::CORE::'},
'_</System/Library/Perl/5.16/darwin-thread-multi-2level/Data/Dumper.pm' => *{'::_</System/Library/Perl/5.16/darwin-thread-multi-2level/Data/Dumper.pm'},
'_<hoge.pl' => *{'::_<hoge.pl'},
'_<DynaLoader.c' => *{'::_<DynaLoader.c'},
'_</System/Library/Perl/5.16/utf8_heavy.pl' => *{'::_</System/Library/Perl/5.16/utf8_heavy.pl'},
'stdin' => *::stdin,
'ARGV' => *::ARGV,
'INC' => *::INC,
'ENV' => *::ENV,
'_</System/Library/Perl/5.16/warnings.pm' => *{'::_</System/Library/Perl/5.16/warnings.pm'},
'Scalar::' => *{'::Scalar::'},
'vars::' => *{'::vars::'},
'XSLoader::' => *{'::XSLoader::'},
'_<perlio.c' => *{'::_<perlio.c'},
'B::' => *{'::B::'},
'main::' => *{'::main::'},
'Carp::' => *{'::Carp::'},
'PerlIO::' => *{'::PerlIO::'},
'0' => *{'::0'},
' => *{':'},
'.' => *{'::.'},
'@' => *{'::@'},
';' => *{'::;'},
'STDOUT' => *::STDOUT,
'_</System/Library/Perl/5.16/darwin-thread-multi-2level/auto/Data/Dumper/Dumper.bundle' => *{'::_</System/Library/Perl/5.16/darwin-thread-multi-2level/auto/Data/Dumper/Dumper.bundle'},
'_</System/Library/Perl/5.16/constant.pm' => *{'::_</System/Library/Perl/5.16/constant.pm'},
'3' => *{'::3'},
']' => *{'::]'},
'_</System/Library/Perl/5.16/Carp.pm' => *{'::_</System/Library/Perl/5.16/Carp.pm'},
'' => *{'::'},
'' => *{'::'},
'threads::' => *{'::threads::'},
'Dumper' => *::Dumper,
'bytes::' => *{'::bytes::'},
'STDERR' => *::STDERR,
'_<Dumper.c' => *{'::_<Dumper.c'}
};
この中に'INC' => *::INCという項目があるため、@INC, %INCについてはmainのシンボルテーブルに属していることが分かる。
glob
ファイルの一覧を取得できる関数。
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $path = "*"; my @files = glob $path; # my @files = <$path>;でも同様の結果が得られる warn Dumper \@files;
$ perl hoge.pl
# glob
$VAR1 = [
'AndroidstudioProjects',
'Applications',
'Desktop',
'Documents',
'Downloads',
'hardcopy.0',
'hoge.pl',
'Library',
'macports',
'Movies',
'Music',
'perl5',
'Pictures',
'Public',
'src'
];
$ ls -l
total 16
drwxr-xr-x 3 user group 102 10 15 15:51 AndroidstudioProjects
drwx------ 3 user group 102 11 25 2013 Applications
drwx------+ 7 user group 238 10 31 14:11 Desktop
drwx------+ 14 user group 476 11 19 20:08 Documents
drwx------+ 267 user group 9078 11 26 11:07 Downloads
drwx------@ 58 user group 1972 11 7 09:47 Library
drwx------+ 3 user group 102 4 16 2013 Movies
drwx------+ 4 user group 136 7 18 09:53 Music
drwx------+ 6 user group 204 1 20 2014 Pictures
drwxr-xr-x+ 4 user group 136 4 16 2013 Public
-rw-r--r-- 1 user group 581 8 14 10:25 hardcopy.0
-rw-r--r-- 1 user group 123 12 2 09:42 hoge.pl
drwxr-xr-x 12 root admin 408 2 18 2014 macports
drwxr-xr-x 5 user group 170 6 12 2013 perl5
drwxr-xr-x 11 user group 374 8 27 16:12 src
pathを直下のファイルやディレクトリに指定すると、lsと同じ結果が得られる。