型グロブを理解する
型グロブは、シンボルテーブルのエントリーを表現します。
*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";