シンボルテーブル

perlでは名前空間を「パッケージ」と呼ぶ。パッケージが基本ブロックとなり、この上にモジュールやクラスという上位概念が構築される。すべてのコードは特定のパッケージに属している。パッケージに属していないように見えるものも実は「mainパッケージ」に属している。下記のコードは「mainパッケージ」に属している。

#!/usr/bin/perl
use strict;
use warnings;

our $test;

print *test{PACKAGE} . "\n"; # main

package宣言以降のすべての識別子は、カレントパッケージに属するシンボルテーブルに登録される。シンボルテーブルの名前は

%パッケージ名:

となっている。シンボルの名前がキーとなっている。mainパッケージの場合のシンボルテーブルの名前は、

%main:
#または
%:

となる。

package MyTest;

our $test;

sub print {
   print "Test\n";
}

このコードでの「$test」と「sub print」は、シンボルテーブル「%MyTest:」に格納される(mainを省略せずに書くと「%main:MyTest:」となる)。
つまり「package」は、どのシンボルテーブルに所属するのかを宣言するために使用していると言える。従って、下記のように同じパッケージでもバラバラに書ける。

package MyTest;
our $test;
sub print {
   print "Test\n";
}

package MyTest2;
our $test2;


package MyTest;
our $test3;

mainシンボルテーブル

以下のものは、強制的にmainシンボルテーブルに格納される。

  • 英文字以外の変数($!,?,_)
  • STDIN,STDOUT,STDERR,ARGV,ARGOUT,ENV,INC,SIG

下記のコードで、mainシンボルテーブルに格納されているシンボルを見てみた。

foreach my $key (sort keys %main::) {
    print "$key\n";
}

出力結果

ARNING_BITS

!
"
$
+
-
/
0
:
@
ARGV
BEGIN
CORE:
Carp:
DB:
DynaLoader:
ENV
Exporter:
INC
IO:
Internals:
PerlIO:
Regexp:
SIG
STDERR
STDIN
STDOUT
UNIVERSAL:
_
_

参考文献

[1]Larry Wall, Tom Christiansen, Jon Orwant "プログラミング Perl VOLUME 1 「10章 パッケージ」"