教えて!gooにおける不適切な投稿への対応について

CGIの勉強をしているのですが、
$value
@value
の意味はわかるのですが、
*value
の意味がわかりません。
お願いします。

gooドクター

A 回答 (2件)

* は「型グロブ」です。


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変数はグローバル変数を一時退避させて使うだけなので、グローバル変数と考えることができます。)
    • good
    • 0

参照渡しです。


下記参照。

参考URL:http://flex.ee.uec.ac.jp/texi/perl/perl_144.html
    • good
    • 0
この回答へのお礼

回答有り難うございました。
まだperl初心者の自分にとっては難解ではありますが。

お礼日時:2003/03/19 12:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング