tech::hexagram

personal note for technical issue.

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と同じ結果が得られる。