[Moscow.pm] Небольшой баг?

Вячеслав Матюхин me на berekuk.ru
Вт Ноя 2 09:21:29 PDT 2010


On Nov 2, 2010, at 19:06, Denis Evdokimov wrote:

> Несколько моментов
> * баг или я что-то не так делаю?
> * где-нибудь может выстрелить? К примеру в XS модулях.
> * Почему так?
> 
> use Data::Dumper;
> 
> my @array = ( 0 .. 3 );
> for ( my $index = $#array ; $index >= 0 ; $index-- )
> {
>    print Dumper($index);
> }

$ perl -MDevel::Peek -le 'my @x = (1,1,1); print Dump($#x);'
SV = PVMG(0x100825588) at 0x100800f40
  REFCNT = 1
  FLAGS = (GMG,SMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x1002019a0
    MG_VIRTUAL = &PL_vtbl_arylen
    MG_TYPE = PERL_MAGIC_arylen(#)
    MG_OBJ = 0x100800f60

То есть $#x - это не константа, а магическая переменная, поэтому Dumper предпочитает считать ее строкой.
В нее даже присваивать можно:

$ perl -MData::Dumper -MDevel::Peek -le 'my @x = (1,1,1); my $y = \$#x; $#x += 3; print Dumper \@x'
$VAR1 = [
          1,
          1,
          1,
          undef,
          undef,
          undef
        ];

Еще интересно, что если включить pure-perl режим у Dumper'а, то он перестает ставить это значение в кавычки.
В xs-версию Dumper'а я не смотрел, но примерно понятно, что он смотрит на IV/NV/PV, чтобы определить, является ли скаляр числом или строкой.

-- 
Вячеслав Матюхин
http://friendfeed.com/mmcleric
http://berekuk.ru



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