名前空間(1) 型グロブ

今まで勘違いしていたのですが、変数の名前空間は変数名の頭に付ける記号ごと(スカラー変数、配列、ハッシュ、関数など)で独立しているので、同じ名前で違う種類の変数を使うと全く別の変数として扱われるんですね。
これはつまり「$hoge」「@hoge」「&hoge」などは全部が違う変数で、別物になるという事です。値を代入しても他の変数には全く影響しません。
配列の要素に添え字付きでアクセスする場合、「$hoge[5]」のように頭に $ を付けますが、後ろに角カッコ([])を付けるので、「$hoge」とはやはり別物として扱われるそうです。
しかし、これらの同名の変数を「まとめて処理したい」という場合(ちょっと僕には具体的なケースが思いつきませんが)、「型グロブ」(typeglob)という機能を使えばいいそうです。型グロブは、変数名の頭に「*」を付ける事で得る事ができます。
例えば「*hoge」という型グロブは、「$hoge」「@hoge」「&hoge」など「hoge」という名前の変数の総称になるわけですね。
型グロブの主な用途は、変数の「エイリアス」(別名)を作る事らしいです。例えば「*fuga = *hoge;」と書くと、fuga が hoge の別名になります。こうすると $fuga は $hoge を指し示す事になり、@fuga は @hoge の別名になります。
という事で、書いてみました。

 # typeglob.pl
 
 my $hoge = "This is hoge string!";
 my @hoge = ("This", "is", "hoge", "array!");
 sub hoge { return "This is hoge sub!"; }
 
 print "$hoge\n";
 print "@hoge\n";
 print &hoge, "\n";
 
 *fuga = *hoge;
 
 print "$fuga\n";
 print "@fuga\n";
 print &fuga, "\n";

まずスカラー変数 $hoge、配列 @hoge、関数 &hoge をそれぞれ宣言しています。そして型グロブを代入する事で fuga を hoge の別名にしました。
実行してみると……

Possible unintended interpolation of @fuga in string at typeglob.pl line 14.
This is hoge string!
This is hoge array!
This is hoge sub!
Use of uninitialized value in concatenation (.) or string at typeglob.pl line 13.


This is hoge sub!

あれ? 警告がでてしまいました。しかも $fuga と @fuga の内容が print できていません。2つある警告は文面から察するに「$fuga と @fuga が初期化されていない」と言っているようです。
スペルミスやtypoもないみたいなので、どこが間違っているのかよくわかりません。それとも、エイリアスの作り方が間違っているのでしょうか。
色々調べたけど、原因はわかりませんでした。うーん……(-_-;)

追記 (2006/05/10)

変数の宣言に my を使っていたからでした。(^-^; our で宣言すれば動きます。