2008-01-10
my と local のサンプル
local と my の違いが分かるサンプルを書いてみた
our $foo = 0; do { # ... (1) local $foo = 1; do { print "$foo\n" }; # 1 sub { print "$foo\n" } # 0 }->(); do { # ... (2) my $foo = 1; do { print "$foo\n" }; # 1 sub { print "$foo\n" } # 1 }->();
ちなみに do {...} は return の扱いを除いて (sub {...})->() と等価だと考えていいです。まあ、関数をその場で呼び出すようなものですね。単なる {...} との違いは、 {...} が式ではなくて文(ブロック)であって、 do {...} は式(do 関数の呼出し)というところです。
解説
(1) と (2) の do の違いは、構文上含んでいる $foo の宣言が local か my かというところです。
で、それぞれの do の中でさらに do で $foo を参照し、 sub で $foo を参照しています。
do はその場で実行されます。
sub は値(リファレンス)として返され、すぐに実行されます。
そうすると、ソースのコメントに書いてあるような結果が標準出力に出力されます。
なぜ、そうなるのか
構文上のスコープ
package main | | our $foo | | do | | | | local $foo | | | | do | | | | | | $foo を参照 | | | | | | | sub | | | | | | $foo を参照 | | | | | | | do | | | | my $foo | | | | do | | | | | | $foo を参照 | | | | | | | sub | | | | | | $foo を参照 | | | | | |
これが my, our のスコープ
スタック上のスコープ
perl hoge.pl | | our $foo | | do | | | | local $foo | | | | do | | | | | | $foo を参照 | | | | | | | ここで sub を返す | | | | sub | | | | $foo を参照 | | | | do | | | | my $foo | | | | do | | | | | | $foo を参照 | | | | | | | ここで sub を返す | | | | sub | | | | $foo を参照 | | |
これが local のスコープ
というわけです
><
どうですか><?あってますか?
名前空間については話していません
our と local が同じ名前空間を共有してて、という話や Foo:: や main:: がどうこうと言う話は、名前空間の話なのでスコープとはまた別なのかなという気がしています。
トラックバック - http://d.hatena.ne.jp/amachang/20080110/1199946810
- IT戦記 - local と my
- 初学者の箸置 - [perl] my, localの件
- サタケ家 - ourにmyにlocalか
- 狐と学ぶ空想猫力学入門 - perl の my, local, our の話
- Webアプリを作ろう - 1/10 scrap
- WEB開発日記 - my と local のサンプル - IT戦記
- パラダイムシフトふぁくとりー資材置き場 - <今日のピックアップニ...
- TAKESAKOのはてな出張所 - [Perl] my と local と our の違いにつ...
- 英語とプログラミング気まぐれ日記 - my と local の話より do{}->...
- IT四重奏 - our, my, local
リンク元
- 493 http://techon.nikkeibp.co.jp/article/TOPCOL/20080111/145291/
- 440 http://www.itmedia.co.jp/enterprise/articles/0712/21/news011.html
- 419 http://slashdot.jp/
- 320 http://reader.livedoor.com/reader/
- 311 http://e0166.blog89.fc2.com/blog-entry-367.html
- 256 http://e0166.blog89.fc2.com/blog-entry-365.html
- 245 http://www.google.co.jp/search?q=Amachang&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 225 http://slashdot.jp/it/article.pl?sid=08/01/14/0815249
- 222 http://blog.livedoor.jp/dankogai/archives/50982802.html
- 193 http://blog.livedoor.jp/dankogai/
