型グロブ

型グロブはある名前を持つ変数をすべて持っているような特殊な型だ。*symという風に識別子に*をつけると得ることができる。*はワイルドカードの意味として使われてて、そこにはどんな記号でもはいるってことか。

型グロブをハッシュのように扱うと、各型のリファレンスを得ることができる。

*sym{SCALAR} # \$sym
*sym{ARRAY}  # \@sym
*sym{HASH}   # \%sym
*sym{CODE}   # \&sym
*sym{GLOB}   # \*sym 
*sym{IO}     # ?????

型グロブから型グロブへの代入は、識別子のエイリアスを作ることになる。

$foo = 'hakobe';
@foo = (0,1,2);

*bar = *foo;

print "$bar\n";
print "@bar\n";

のようにすると、fooという名前の変数とbarという名前の変数はまったく同じ物を指すようになる。

特定の型だけをエイリアスしようとするのに、

*bar{SCALAR} = \$foo;

というふうにはできない(Perlがエラーを出力する)。

特定の型だけをエイリアスしたいときには、その型のリファレンスを型グロブに代入する。スカラーだけエイリアスしたいときには、

$foo = 'hakobe';
@foo = (0,1,2);

*bar = \$foo;

print "$bar\n";
print "@bar\n";

とする。実行すると、

$ perl glob_test.pl
hakobe

$ 

となって$barに$fooがエイリアスされてはいるが、@barはそうはなっていないことがわかる。

とりあえず、型グロブの扱いがわかったので、これまで呪文に思えた、

sub AUTOLOAD {
    our $AUTOLOAD;
    no strict 'refs';
    *{$AUTOLOAD} = sub { print "$AUTOLOAD is called\n";};
    goto &{$AUTOLOAD};
}

なんていうAUTOLOADサブルーチンもずいぶん解読できたように思えるな。