[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[plamo:17974] Re: perl



角です。

#と〜〜〜っても余談なんですが

From: 早間義博 <yossi@yedo.src.co.jp>
> 「local はグローバル」と言うのは衝撃的な表現です。最近まで
> 「関数の中で local と書いて置けば、関数外への影響を避けられる。」
> と言う利用方法で用いていました。また、my を使いだしてからも使用方
> 法によって、local で書かないとエラーになります。
> (できる限り my にはしています)

私にとって衝撃的だったのは、undef しないで SetValue から抜けたときに、
SetValue のスコープの外の $number が undef になってしまっていることで
した。へ〜そう来るか・・・という雰囲気でした。いや確かに分かってしまえ
ばな〜んだ(^^;)なんですが。(なので「シンボルテーブルから削除される」
という先の私の表現は激しい間違いです)

というわけで最後に
undef *pointer;
とする以外には、最初に
local($pointer);
じゃなくて
local *pointer;
と型グロブで定義すれば undef する必要はないですね。

こうしてやると、

sub SetValue {
  local *pointer;
  ...
  $pointer = 'town';
}

で抜けたら、しっかり $address が 'town' になります。

> 感想として「スコープ」を理解していないようです。

この手の誤解の影響が大きい例としては、mod_perl 上で動かす場合です。
スコープを適当に捉えて作っていると、いざサーバに乗せたときに得体の知れ
ない動きをします。my だけで定義していてもぐちゃぐちゃになります。

> > このとき、前者は $number へのリファレンスなのに対して、
> > 後者は $keyword->{phone}->{pointer} に *main::number が入ります。
> > これは $main::number なのか &main::number なのかの区別がないんですね。
> 
> この区別がないと言うのは、値が入っているのかリファレンス(これはc
> のポインタと理解しています)か利用時に判別出来ないと言うことですね。

いや、リファレンスが入っているんじゃないんです。
むしろ SetValue の例で言えば $pointer と書けば $main::number のことを
指している(エイリアス?)のような働きです。なので後の私のメールの例では、
&var と書けば &main::hello と「みなして」動くわけです。

ところが $number を my 定義しているとシンボルテーブルに入らないので、
perl -w で起動したら main::number って何やそれ?と *number を使ったと
ころで warning が出ます。

#型グロブは、それはそれで便利な場合もあるので、今でも使っている人は
#結構いるんじゃないかなぁ・・・。

-----
Yasutaka SUMI <sum@mwb.biglobe.ne.jp>
http://pgp.nic.ad.jp:11371/pks/lookup?op=get&search=0x8842F549
Key fingerprint = 5F6D 79E1 E52D 2B38 B9B5  13F5 F8E9 F3E1 8842 F549

References
[plamo:17958] Re: perl, 早間義博
[plamo:17965] Re: perl, Yasutaka SUMI
[plamo:17971] Re: perl, 早間義博

[検索ページ] [メール一覧]
Plamo ML 公開システム