続、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で宣言してるからか。