人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

local *FH;
open FH, $filename

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

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

よろしくお願いします。

●質問者: the_yakisoba
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:CGI open オライリー コード プログラミング
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● tombe
●35ポイント

一般的に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なら素直にオブジェクトを使うのが吉です。


2 ● b-wind
●35ポイント

Perl講座 2章 [変数]

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


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

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


通常の変数であれば、

local $var;

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ