local宣言

よくわかっていないので、コードを書いてみる。

use strict;
use warnings;

our $var = 1;
sub func() {
  $var = 2;
  print "in func: $var\n";
}

func();
print "out of func: $var\n";

実行結果

in func: 2
out of func: 2

use strict;
use warnings;

our $var = 1;
sub func() {
  local $var = 2;
  print "in func: $var\n";
}

func();
print "out of func: $var\n";

実行結果

in func: 2
out of func: 1

なるほど。
local変数ではなく、local宣言なのですな。
宣言したグローバル変数に一時的な値を与えて、スコープの終わりにきたら破棄して元のグローバルな値を見る。

グローバル変数はヒープ領域に格納されているけど、そいつを見ずにスタック領域に入れて扱うということ?
(正確にPerlのメモリ理解してないから合ってないかも)


ちなみに、

use strict;
use warnings;

my $var = 1;
sub func() {
  $var = 2;
  print "in func: $var\n";
}

func();
print "out of func: $var\n";

実行結果

Can't localize lexical variable $var at local.pl

レキシカル変数はローカル宣言できないと言っている。
たしかにそうじゃないと、myの意味がないもんな。