シンボルテーブルと型グロブ

なんとなくは理解していたけど、さらに理解を深めるためにコードを書いてみる。

use strict;

our $foo = "This is foo.";
sub foo {
    print $foo, "\n";
}
our $bar = "This is bar.";
sub bar {
    print $bar, "\n";
}

print "1.----\n";

#型グロブ
*hoge = *foo;
print ${*hoge},"\n";
&{*hoge};

print "2.----\n";

#シンボルテーブル(keyはシンボル識別子、valueは型グロブ)
*hoge = $::{bar};
print ${*hoge},"\n";
&{*hoge};

#型グロブをourやmy宣言は無理(当たり前か)
#our *piyo;
#my *piyo;

print "3.----\n";
#特定の型の変数やサブルーチンのみエイリアス
our $piyo = "This is piyo.";
*piyo = \&foo;
print ${*piyo},"\n"; #This is piyo.
&{*piyo}; #This is foo.

print "4.----\n";
#localは宣言可能
{
    local *piyo = *bar;
    {
        print ${*piyo},"\n"; #This is bar.
        &{*piyo}; #This is bar.
    }
}

print "5.----\n";
print ${*piyo},"\n"; #This is piyo.
&{*piyo}; #This is foo.

実行結果

1.----
This is foo.
This is foo.
2.----
This is bar.
This is bar.
3.----
This is piyo.
This is foo.
4.----
This is bar.
This is bar.
5.----
This is piyo.
This is foo.