Perlでのlocalとmyの違い

以前にあまり意識せずにコーディングした際、バグの原因となった経験から知識を共有します。
Perlではmyとlocalによって、一般的に言うところのローカル変数を定義する事が可能です。
しかし、この2つの命令、一体何が違うのでしょうか。

my

myは「レキシカルスコープ宣言」を行う関数です。
レキシカルスコープとは、乱暴な言い方ですが「{ }で囲まれた内部」です。

local

localは「ダイナミックスコープ宣言」を行う関数です。
ダイナミックスコープとは、これまた乱暴な言い方ですが「{ }で囲まれた内部が実行されている限り」となります。
つまり、呼び出されたサブルーチン等にも変数が引き継がれるのです。

サンプル

以下のサンプルでは、
value_onサブルーチン内にて、$valueをダイナミックスコープ宣言しています。
value_onサブルーチンから呼ぶ、value_offサブルーチン内では、$valueの内容を書き換えています。

&value_on();

sub value_on{
	local $value = "on";
	print $value."\n";   # onと出力されます

	&value_off();
	print $value."\n";   # on...と思いきや、offと出力されます
}

sub value_off{
	$value = "off";
}