[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[plamo:17974] Re: perl
-
From:Yasutaka SUMI
-
Date:Mon, 3 Mar 2003 17:48:54 +0900 (JST)
- Subject: [plamo:17974] Re: perl
- From: Yasutaka SUMI <sum@xxxxxxxxxxxxxxxxx>
- Date: Mon, 03 Mar 2003 17:48:53 +0900 (JST)
角です。
#と〜〜〜っても余談なんですが
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 公開システム