シンボルテーブル
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章 パッケージ」"