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

Vladimir Timofeev vovkasm на gmail.com
Ср Янв 6 12:45:53 PST 2016


Ну вот это уже интереснее )

Так вот:
1. Без дебаггера, $DB::single обычный скаляр, с ним всё происходит как
надо (в вашем случае это был $DB::x,  об этом чуть ниже).
$ perl -MDevel::Peek -e'Dump($DB::single)'
SV = NULL(0x0) at 0x7f882b82dc60
  REFCNT = 1
  FLAGS = ()

2. С подключенным дебаггером.
$ perl -MDevel::Peek -d -e'Dump($DB::single)'
  DB<1> c
SV = PVMG(0x7fc78a025460) at 0x7fc78a004a30
  REFCNT = 1
  FLAGS = (GMG,SMG,IOK,pIOK)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x7fc789c052e0
    MG_VIRTUAL = &PL_vtbl_debugvar
    MG_TYPE = PERL_MAGIC_debugvar(*)

Во втором случае никакой local работать не будет, вернее будет... в
штатном режиме (это можно увидеть, если вставить Dump в ваш код), но
толку нет, потому что к значениям из слотов SV не будет доступа,
вместо этого будет вызываться метод из VTBL магический, который...
возвращает актуальное значение. (это примерное объяснение, я редко
лазил в эту область и внимательно сейчас читать исходники нет ни
времени ни желания :-)

Всю магию, которую вешает дебаггер можно посмотреть в perl.c где-то в
р-не строки 4000, функция Perl_init_debugger. Соотвественно, те
символы, на которых магия могут работать не нормально: DB::single,
DB::trace, DB::signal.

Мне кажется, что для хранения текущего состояния в своём дебаггере,
можно использовать нормальные свои переменные в пакете DB, главное не
пересечься с уже используемыми перлом.

2016-01-06 22:38 GMT+03:00 KES <kes-kes на yandex.ru>:
> Я извиняюсь. Упустил важный момент. Вот полный код:
> $ cat Devel/DB.pm
> package DB;
>
>
> sub DB::DB {
> }
>
> sub sub {
>     {
>         $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";
>     }
>
>     return &$DB::sub;
> }
>
> 1;
>
> $ perl -d:DB -e 'sub t{} t()'
>
> $ perl -v
> This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
>
> PS. Думаю в ближайшее мне придется очень глубоко копнуть в исходники перл, т.к. в дебаг режиме шероховатость на шероховатости :`-(
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



-- 
Vladimir Timofeev <vovkasm на gmail.com>


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