オライリーのCGIプログラミングを読んでいるのですが、

p309にでるコードで、

local *FH;
open FH, $filename

という記述がありました。
ここでの*は型グロブといわれるもののようで、
リファレンスがまだなかったときに使われていたようなのですが、
このケースではどのような働きをしているのでしょうか。

少し調べましたので、
識別子としてワイルドカードのような働きをすることはわかりました。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/05/23 21:03:54
  • 終了:2007/05/30 21:05:02

回答(2件)

id:tombe No.1

tombe回答回数38ベストアンサー獲得回数72007/05/23 22:41:20

ポイント35pt

一般的にPerlの型として知られているものは、$aa , @bb , %cc ですが、もうひとつ、頭に記号の付かない(ベアワード) ee 形式のファイル記述子があります。

注1)ここで言う「型」は他の言語の意味とは違い、Perlの場合は「データ構造クラス」と言った方が適切。

注2)型識別子としては、さらにもうひとつ &(関数)がある。


local *FH;

open FH, $filename


この例は、本来なら

  my FH;

あるいは

  local FH;

としたいところですが、my も local もベアワードを許しません。

それで型グロブの記号 * を付ける事によって、この制限を回避しているわけです。(結果として、無関係な $FH , @FH , %FH も道連れになる)

ただし、Perlの仕様として最初からあったlocal(動的スコープ)と違い、my(レキシカルスコープ)は比較的新しい仕様ですから型グロブも許していません。

従って、ファイル記述子を局所変数として宣言するには、"local *FH;" と書くしか方法が無い・・・というのがこのケースの意味です。

上記の例文はかなり古い記述ですから、今どきのPerlなら素直にオブジェクトを使うのが吉です。

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/05/23 23:19:27

ポイント35pt

Perl講座 2章 [変数]

型グロブ自体の概念は、うえのリンクが図入りで(まだ)分かりやすいかと。


例示されているコードでは local 関数を使うことで、FH ファイルハンドルの名前を局所化しています。

つまり該当部分のブロックを出たあとなら FH という同じ名前のファイルハンドルをつかっても別のものとして扱えると言う事になります。


通常の変数であれば、

local $var;

とすることでそのまま局所化できるのですが、ファイルハンドル自体を local 関数に渡す事が出来ないので、型ブログを使うことで代用しています。

副作用として、スカラーや配列と言ったほかの同名の変数も局所化されています。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません