シンボルテーブルの中身を覗いてみる
Perlは、シンボルテーブルというものを持ち、プログラマーが、それを参照したり、変更を加えたりすることができます。Perlは、他の言語に比べて、柔軟で、高い適応力を持ちますが、その力をを生み出している機能のひとつがシンボルテーブルです。
シンボルテーブルは、%main:: という名前の単なるハッシュです。%main:: というハッシュから、実行されているスクリプトの持つすべてのサブルーチンとパッケージ変数を知ることができます。( レキシカル変数を除く )
シンボルテーブルの内容を覗いてみる
# mainパッケージの内容を含むシンボルテーブル %main:: # %main:: の別名 %::
シンボルテーブルを通じて、パッケージ変数の内容を知る
our $num = 1;
${$main::{num}};
詳しい説明は、型グロブの解説で、説明します。ここでは、シンボルテーブルから、パッケージ変数の内容やサブルーチンの内容を知ることができるというPerlの機能について、覚えておいてください。
シンボルテーブルを中身を出力するサンプルです。
use strict;
use warnings;
# シンボルテーブルを覗いてみる。
# このサブルーチンは、コンパイル時に、シンボルテーブルに登録される。
# パッケージ宣言を、行っていないので、暗黙的にmain パッケージに属するものと
# されます。
our $num = 1;
sub func {
return 2;
}
print "1: シンボルテーブルを覗いてみる\n";
require Data::Dumper;
print # シンボルテーブルは、単なるハッシュです。
# main パッケージに、属するものは、
# %main:: という名前で、参照できます。
Data::Dumper->Dump([\%main::], [qw( *main:: )]),"\n";
print "2:mainパッケージの num と func の内容を見る。\n";
print $main::{ num },"\n";
# main:: の別名として、 :: も使うことができます。
print $::{ num }, "\n";
print $main::{ func }, "\n";
print $::{ func }, "\n\n";
print "3: シンボルテーブルから、変数の内容を取得する。\n";
# ${ } で、'*main::num' から、スカラー変数を取り出す。
my $num_from_symbol = ${$main::{num}};
print $num_from_symbol;
出力結果の意味
print $main::{num};
# 出力結果
*main::num
上記の出力結果は、 *main::num と表示されます。* 記号は、型グロブを表現する記号です。型グロブは、次回説明。
Perlゼミ

