シンボルテーブルのお話

Perlにはパッケージってのがあってパッケージごとに管理できるわけだよ。モジュールとか変数とかを、でだ、そのパッケージごとにシンボルテーブルがあって、それを見てみたい。

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

foreach (values %main::) {
  print $_, "\n";
}
exit;

出力結果

 *main::version::
*main::/
*main::stderr
*main::_<perllib.c
*main::Tie::
*main::utf8::
*main::"
*main::^WARNING_BITS
*main::re::
*main::CORE::
*main::DynaLoader::
*main::mro::
*main::strict::
*main::stdout
*main::Win32CORE::
*main::attributes::
*main::^R
*main::stdin
*main::ARGV
*main::INC
*main::ENV
*main::Regexp::
*main::_<Win32CORE.c
*main::_<..\perlio.c
*main::UNIVERSAL::
*main::$
*main::^RE_TRIE_MAXBUF
*main::main::
*main::Carp::
*main::Win32::
*main::PerlIO::
*main::_<..\universal.c
*main::0
*main::BEGIN
*main::
*main::@
*main::_<..\xsutils.c
*main::_<..\mro.c
*main::STDOUT
*main::IO::
*main::^X
*main::_
*main::STDERR
*main::_<win32.c
*main::Internals::
*main::STDIN
*main::warnings::
*main::DB::

mainパッケージには色々なものがシンボルテーブルにありますね。ちょっとスクリプトを変更。

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

our $aaa = 1;
our @bbb = (1, 2, 3, 4, 5);
our %ccc = (1 => 111, 2 => 222, 3 => 333);
sub ddd {
  return;
}

foreach (values %main::) {
  print $_, "\n";
}
exit;
 *main::version::
*main::/
*main::stderr
*main::_<perllib.c
*main::Tie::
*main::utf8::
*main::"
*main::^WARNING_BITS
*main::re::
*main::CORE::
*main::DynaLoader::
*main::mro::
*main::strict::
*main::stdout
*main::Win32CORE::
*main::attributes::
*main::^R
*main::stdin
*main::ARGV
*main::INC
*main::ENV
*main::Regexp::
*main::_<Win32CORE.c
*main::_<..\perlio.c
*main::UNIVERSAL::
*main::ccc
*main::$
*main::bbb
*main::^RE_TRIE_MAXBUF
*main::main::
*main::Carp::
*main::Win32::
*main::PerlIO::
*main::_<..\universal.c
*main::0
*main::aaa
*main::BEGIN
*main::
*main::@
*main::_<..\xsutils.c
*main::_<..\mro.c
*main::STDOUT
*main::IO::
*main::^X
*main::_
*main::STDERR
*main::_<win32.c
*main::Internals::
*main::STDIN
*main::warnings::
*main::DB::
*main::ddd

沢山あってわかりにくいですが、先ほど追加したスカラー、配列、ハッシュ、関数は追加されていますね。凄い!注目は各種変数の先頭が「our」になっていることです。なぜかというと、「my」だと別領域に格納されてしまいます。

シンボルテーブルの領域の事を「スタッシュ」とも言い、「my」で宣言された変数を格納する場所を「スクラッチパッド」と言うそうです。面白いですね。そんだけ!

どうでもいい話ですけど、

my $scalar = 1;
my @array = (1, 2, 3, 4);
my %hash = (1 => 1111);

my $scalar = 1;
my $array = (1, 2, 3, 4);
my $hash = {1 => 1111};

が私の頭の中でごちゃごちゃになっていたんだが、すっきりした事。上の方はファニー文字で、そのものを表しているから問題ないが、下は全部スカラーとして表されている。スカラーに対してハッシュを格納する場合、ハッシュのリファレンスを格納しているんだよね。「{}」がハッシュのリファレンスを表すなんて理解できてなかったから、もやもやしていたが解決?だよね。

もちろんスカラー変数を通してハッシュにアクセスするには、「$hash->{1}」としなければならんのだが、なんかすっきりした。ではでは