[Moscow.pm] Fwd: Почему меняется старое значение, хотя переменная локализирована?

KES kes-kes на yandex.ru
Ср Янв 6 03:50:24 PST 2016


День добрый.
Локализация $DB::single работает без проблем, но если брать ссылку на неё, то возникают проблемы:
The localization of $DB::single works fine, but the reference to it does not work:
        {
                $DB::single = 7; my $x = \$DB::single;
                print "Before: ". \$DB::single ." <<$x $$x\n";
                local $DB::single = 0;
                print "After: ". \$DB::single ." <<$x $$x\n";
        }

The output/Вывод
Before: SCALAR(0x10f8310) <<SCALAR(0x10f8310) 7
After: SCALAR(0x110cbc8) <<SCALAR(0x10f8310) 0

В то время как:
Where as works fine:
        {
                $DB::z = 7; my $x = \$DB::z;
                print "Before: ". \$DB::z ." <<$x $$x\n";
                local $DB::z = 0;
                print "After: ". \$DB::z ." <<$x $$x\n";
        }
The output:/Вывод
Before: SCALAR(0x134d398) <<SCALAR(0x134d398) 7
After: SCALAR(0x1239bc8) <<SCALAR(0x134d398) 7

Тут видно, что в первом примере память выделена: Новый адрес $DB::single является: SCALAR(0x110cbc8)
Но когда присваиваем новое значение в $DB::single, то значение по старому адресу ((SCALAR(0x10f8310)) меняется тоже
Во втором примере мы видим, что выделение памяти происходит по той же схеме, но значение 7 сохранено как и ожидалось.
We see that in *first* example the new variable is created: The new address of $DB::single is SCALAR(0x110cbc8)
but when assigning to $DB::single the value by old reference (SCALAR(0x10f8310) changed too.
In *second* example we see that addressing works in same manner, but value 7 is preserved as expected.

Почему значение $DB::single по старой ссылке меняется?
Why the value of $DB::single by old reference is not preserved?

PS. Можно отвечать на русском.


Подробная информация о списке рассылки Moscow-pm