続、ourにmyにlocalか
もう一つスコープをネストしてみた。
#!/usr/bin/perl use strict; use warnings; $\ = "\n"; our $var = 'our'; sub func() { $var = 'func'; print $var; } print $var; scope_a: { local $var = 'local'; print $var; func(); print $var; scope_a_a: { local $var = 'foo'; print $var; } print $var; } scope_b: { my $var = 'my'; print $var; func(); print $var; scope_b_a: { my $var = 'foo'; print $var; } print $var; } print $var;
実行結果
our # グローバルスコープ、アタリマエの結果 local # scope_aでlocal宣言、アタリマ(ry func # グローバルスコープで、func()にて、funcと代入。予想通り。 func # 「localは値をスコープ内に限定」なるほど。名前では限定されないので、グローバルで代入した結果が生きている。 foo # scope_a_aでlocal宣言。 func # 予想通り。 my # scope_bでmy宣言、当然。 func # グローバルスコープで、func()にて、funcと代入。予想通り。 my # で、ここがlocalとの違い。「myは名前と値の両方をスコープ内に限定」の説明どおり。 foo # scope_b_aでmy宣言。 my # これも予想通りです。 func # グローバルで代入してんだから当然だわな。「ourは名前をスコープ内に限定」確かに。
で、scope_b_aのmyをlocalにしてみたら、
scope_b_a: { local $var = 'foo'; print $var; }
Can't localize lexical variable $var at ./scope.pl line 39.
怒られたお(^ω^ ;; こういう書き方ダメなんだ。。。事前にmyで宣言してるからか。