>>783
どういう動作をする代物なのかは既に理解しているようなので、
何故my $self = { やreturn {ではダメなのか、だけ。

#わかりやすくするため、簡略化する
my $var;
my $self = 'global self';
{
my $self = sub{ return \$self }
$var = $self;
}

print ${$var->()};
# => レキシカル変数$selfの値、無名サブルーチン"CODE(...)"が印字される

{
my $self = sub{ return \$self }
$var = $self;
}

print ${$var->()};
# => my .. ; の時点では、その変数のスコープは存在しない。
# よって*グローバル変数* $selfの値 "global self"が印字される

{
$var = sub{ return \$self };
}
print ${$var->()};
# 上と同じく、"global self"が印字される