型グロブを理解する
型グロブは、シンボルテーブルのエントリーを表現します。
*main::num # $main::{num} とほぼ同じ意味。
*num # パッケージ名を省略することもできます。
シンボルテーブル上の、 $main::{num} には、'*main::num' という文字列が代入されていますが、ずばりこれを表します( シンボルテーブルのエントリーと呼ばれている。たぶん )。ただし、文字列ではなく、型グロブというものになります。
パッケージ名を省略すると、現在のカレントパッケージのシンボルテーブルのエントリになります。
型グロブと変数
my $num_from_typedglob = ${*main::num}; # $numと同じ
my @num_from_typedglob = @{*main::num}; # @numと同じ
my %num_from_typedglob = %{*main::num}; # %numと同じ
my $ret_from_typedglob = &{*main::num}; # &numと同じ( num() とも同じ )
型グロブは、一種のハッシュであり、スカラー変数、配列、ハッシュ、サブルーチンなどにアクセスすることができます。デリファレンスと見た目が、まったく同じですが、デリファレンスではありません。
型グロブのイメージ
|-------------|
| *typedglob |--|
|-------------| |
| |-----------------|
|----->| ${ *typedglob } |
| |-----------------|
|----->| @{ *typedglob } |
| |-----------------|
|----->| %{ *typedglob } |
| |-----------------|
|----->| &{ *typedglob } |
|-----------------|
サンプル
型グロブとシンボルテーブルを理解するためのサンプルです。
use strict;
use warnings;
# 型グロブ
# *typedglob;
# シンボルテーブルのエントリーを表現する。
# 名前が同じで、ファニー文字($, @, %)だけが異なる変数
our $num = 11;
our @num = (12, 13);
our %num = (key => 14);
# 名前が同じサブルーチン
sub num {
return 15;
}
require Data::Dumper;
print "1-1: シンボルテーブルから、変数にアクセスする。\n";
# ${ } で括ると、スカラーのエントリ
my $num_from_symbol = ${$main::{num}};
# @{ } で括ると、配列のエントリ
my @num_from_symbol = @{$main::{num}};
# %{ } で括ると、ハッシュのエントリ
my %num_from_symbol = %{$main::{num}};
print Data::Dumper->Dump([$num_from_symbol], ['*num_from_symbol']);
print Data::Dumper->Dump([\@num_from_symbol], ['*num_from_symbol']);
print Data::Dumper->Dump([\%num_from_symbol], ['*num_from_symbol']);
print "\n";
print "1-2: シンボルテーブルから、サブルーチンを呼び出す。\n";
my $ret_from_symbol = &{$main::{num}}; # &{ } で括ると,サブルーチンのエントリ
print "\$ret_from_symbol = $ret_from_symbol\n\n";
print "2-1: 型グロブから、変数にアクセスする。\n";
my $num_from_typedglob = ${*main::num}; # ${ } で括ると、スカラーのエントリ
my @num_from_typedglob = @{*main::num}; # @{ } で括ると、配列のエントリが
my %num_from_typedglob = %{*main::num}; # %{ } で括ると、ハッシュのエントリ
print Data::Dumper->Dump([$num_from_typedglob], ['*num_from_typedglob']);
print Data::Dumper->Dump([\@num_from_typedglob], ['*num_from_typedglob']);
print Data::Dumper->Dump([\%num_from_typedglob], ['*num_from_typedglob']);
print "\n";
print "2-2: 型グロブから、サブルーチンを呼び出す。\n";
my $ret_from_typedglob = &{*main::num};
print "\$ret_from_typedglob = $ret_from_typedglob\n\n";
Perlゼミ

