[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