[Tokyo-pm] Re: これはどう動くの?
Shinya Hayakawa
tetryl @ tokyoprogrammer.com
2004年 8月 26日 (木) 20:58:41 CDT
こんにちは。早川です。
On 2004 8月 27 金曜日 12:41 午前, Dan Kogai wrote:
> それにしても早川君って「モツ好き」だよなあ....
モツ?...あぁ、gutsってことですね(^^;
> > my 変数と同様に、参照カウントを増やすことで
> > スコープを抜けた後も、中身が解放されない事を利用してます。
>
> え?この場合は、REFCNTは関係ないはず。以下を実行してみて実際のref countを確認してみてください。
>
> perl -MDevel::Peek -le '@a=qw/a b c/; sub a{ \@_ }; $b=a(@a);Dump $b'
>
> $b のREFCNTは1のまま。@$bのREFCNTも1のまま。というか1で充分。
いえ、Dumpする場所を追加すると,
perl -MDevel::Peek -le '@a=qw/a b c/; sub a{Dump \@_; \@_ }; $b=a(@a);Dump $b'
REFCNTは3に増えている事が分かります。
@_ 自身はスクラッチパッド上に確保されるので
保存の仕組みはクロージャと全く同じですよね。
> #ただし、$b->[]の各要素のSVのref countは1づつ上がる。
> #うむむ、むしろこちらの方が不(思議|可解)だ!
引数スタックに積まれる時にcountが上がるのでしたっけ。
後で調べてみます。
> 特にコワいのは、
>
> substr(shift,0,-1), @_;
>
> では同一statementで@_の内容を変更していること。shiftと@_とどっちが先に評価されるかというのはCでは未定義なんだよね(K&R
> pp.
> 52)。perlでも明示的に定義はしてなかったように思うが、今のところどのplatformでもshiftの方が先に評価されるみたい。だけどCは
> そうは行かない。
あっ、でも自分の場合は@_のリファレンスを使ってるだけだから
shiftが実行されるのは先でも後でも問題なかったですね。
-- 今気づいた(^^;
--
Shinya Hayakawa
hayakawa at livedoor.jp
Tokyo-pm メーリングリストの案内