シンボルテーブルのお話
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}」としなければならんのだが、なんかすっきりした。ではでは