IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Perl の local

最近、やっと普通に Perl が書けるようになってきた

やっとね。

しかし、「書ける」と「分かる」とは違う

まだまだ Perl のこと分かってないな。

ということで、

Perl の分からないところをいろいろと考察してみようと

まず、 local が分からん

Catalyst のソースを読んでて、だいたい使い方は分かった。
自分より上に積まれたスタック上のグローバル変数(?)の参照先を動的に換える。
ということだろうか。

でも、

以下のような感じのソースも見かけたことがあるので、グローバル変数ということではなさそう。

sub piyo {
	my $c = shift;
	my $code = shift;
	local $c->{hoge} = 'fuga';
	$code->();
}

グローバルじゃなくてもいいということは、

これは?

sub piyo {
	my $self = shift;
	local $self = bless {}, 'Hoge';
}
Can't localize lexical variable $self

なるほど、my が付いてるとダメなんだ

たぶん分かった

自分の言葉でなんとなくだけど、
local ってやると、そこに書いてある参照のチェーンみたいなものを変えることが出来るんだ。

local $a->{a};

これだったら、$a が持ってる {a} のポインタを変える。

local $a;

これだったら、*{package::a} が持ってる $a のポインタを変える。

my $a;
local $a;

これだったら、lexical スコープが持ってる $a のポインタを変えようとするんだけど、それは出来ないらしい。←意味がないのは分かるけど何で出来ないのかよくわからん

local *a;

これだったら、グローバルオブジェクトみたいなものがもってる、*a のポインタを変える。

これであってるのかな?