А какая версия Perl у вас?

А то вот я запускаю ваш пример в виде такого скрипта:
=== test.pl
#!perl

print "Case 1. DB special var\n";
{
    $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";
}

print "Case 2. Normal scalar\n";
{
    $DB::xxx = 7; my $x = \$DB::xxx;
    print "Before: ". \$DB::xxx ." <<$x $$x\n";
    local $DB::xxx = 0;
    print "After: ". \$DB::xxx ." <<$x $$x\n";
}
===

На 5.22.1 получаю:
Case 1. DB special var
Before: SCALAR(0x7f914a029b60) <<SCALAR(0x7f914a029b60) 7
After: SCALAR(0x7f914a004850) <<SCALAR(0x7f914a029b60) 7
Case 2. Normal scalar
Before: SCALAR(0x7f914a030e40) <<SCALAR(0x7f914a030e40) 7
After: SCALAR(0x7f914a004a00) <<SCALAR(0x7f914a030e40) 7

То же самое получаю на системных (из макоси) 5.18 и 5.16.

Но реально можно всякого ожидать от попытки натравить магию на и так
магическую штуку ))) И уж совсем не понятно, что же вы пытались
сделать, что в итоге такой кусок кода получился )))

Если серьёзно, то ищите PL_DBsingle в *.h, *.c файлах в исходниках ;-)


On Wed, Jan 6, 2016 at 2:50 PM, KES <[email protected]> wrote:
> День добрый.
> Локализация $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 mailing list
> [email protected] | http://moscow.pm.org



-- 
Vladimir Timofeev <[email protected]>
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить