質問: *(アスタリスク)の意味 cgiの勉強をしているのですが、 $value @value の意味はわかるのですが、 *value の意味がわかりません。 お願いします。
回答: * は「型グロブ」です。 perl5において、「参照」はリファレンスを指しますので、この場合正しくありません。 perlでグローバル変数を使うと、各パッケージに存在する「名前テーブル」が参照されます。 名前テーブルの実体はハッシュで、キーが変数名、値がその変数へのポインタです。 しかしperlでは、1つの変数名に対し、複数の意味を持たせることができます。 例えば $value と @value です。 この2つの変数において、名前テーブルハッシュのキーは、どちらも value です。 これだと両方の値を格納することができませんよね? これをうまく実現するために、名前テーブルハッシュの値は、複数のスロット(部屋)でできています。 ちょうどcの構造体のような形です。 この「名前テーブルの区画をなす、複数スロットで構成された構造体」が型グロブです。 型グロブ *value からスカラー値を取り出すには ${*value} とします。 配列値を取り出すなら @{*value} です。 perlは $value という記述を見つけると、名前テーブルから value を探し、そこからスカラー値を取り出しているのです。 ちなみに名前テーブルは、 %パッケージ名:: というハッシュとして実際にアクセスできます。 特にパッケージ宣言をしていなければ、パッケージ名は main となります。 これを使って先ほどの $value や @value にアクセスするには ${$main::{value}} @{$main::{value}} とします。 型グロブも1つのデータなので、代入などを行うことができます。 *other = *value とすると、*value の全スロットの値が *other に代入されます。 各スロットの値はポインタなので、$other という記述で $value をアクセスできるようになるのです。 同じく @other で @value がアクセスできます。 perl4にはリファレンスが無かったので、この型グロブを使って参照渡しをしていたのですが、perl5ではリファレンスを使うのが主流です。 (一部のリファレンスで実現できない機能を、型グロブで実現しているモジュールもあります。) また、冒頭で書いた通り、型グロブはグローバル変数にのみ存在します。 my変数には型グロブが存在しないので、ご注意ください。 (local変数はグローバル変数を一時退避させて使うだけなので、グローバル変数と考えることができます。)