Занятная перловая багофича?

Все о программировании под *nix
Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Занятная перловая багофича?

Сообщение grub »

Вчера чуть не свихнулся, пока обнаружил. Обнаружив -- задумались всем отделом.

Код: Выделить всё

#!/usr/bin/perl

use DBI;
use Data::Dumper;

### инициализация соединения с mysql 
### и оффтопный код поскипаны

$sql="select OPTIN, count(*) as NUMBER from TBL group by OPTIN';   # OPTIN is tinyint(1) 
$sth=$dbh->prepare($sql); $sth->execute;

while ($db_ent=$sth->fetchrow_hashref)
{

print Dumper($db_ent), "\n";
print "Optin with quotes: ",   Dumper($db_ent->{'OPTIN'}, "\n";
print "Optin without quotes:", Dumper($db_ent->{OPTIN}, "\n";
}
А теперь -- внимание -- фрагмент вывода дампера:

Код: Выделить всё


db_ent: $VAR1 = {
          'OPTIN' => '1',
          'NUMBER' => '138'
        };


Optin with quotes:	   $VAR1 = undef;      
Optin without quotes:	 $VAR1 = '1';
Обратите внимание на предпоследнюю строку...
У кого-нибудь есть занятных мыслей по этому поводу?
Змагайся і адпачывай!

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

м... прошу прощения, но это точно тот код...? Если б вместо Dumper($db_ent->{'OPTIN'}, "\n"; было Dumper($db_ent->{`OPTIN`}, "\n"; - это многое бы объясняло.
Кстати, попробуйте с двойными кавычками ;)
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Сообщение grub »

В том-то и фишка, что код в точности тот.
Более того, в процессе отладки использовалась аналогичная конструкция для NUMBER -- в ней и с кавычками и без кавычек честно виделся номер.

А опечататься столько раз я не мог -- собственно приведенный скрипт это уже результат черт-те какого этапа диагностики скрипта, где оригинальная ошибка возникла.

Совершенно точно -- добавление/удаление одинарных кавычек вокруг литерала приводит к переключению распознавания/нераспознавания поля. Для данного конкретного объекта в данном конкретном участке кода.

Точнее, закономерность воспроизводима на 90%. В оставшихся 10% случаев ошибка кратковременно исчезает, хотя действия (включение-выключение дампера) абсолютно тривиальны и ничем не отличаются от действий в остальных случаях.

Что характерно, удаление вызовов дампера из работающего скрипта немедленно восстанавливало ошибку, даже если она была в состоянии "кратковременного исчезновения".
Змагайся і адпачывай!

Аватара пользователя
grub
Неотъемлемая часть форума
Сообщения: 849
Зарегистрирован: 13 сен 2006, 10:29
Откуда: Минск
Контактная информация:

Сообщение grub »

Окружающий код сделан не лучшим образом (не мной), там достаточно много require-ов самопальных модулей, смешан модульный, объектный и библиотечный подход....

Но тем не менее интересно -- что в принципе могло привести к такому мистическому поведению перла?

Руки чешутся предположить, что конкретная хаотическая комбинация use и require имеющая место в начале скрипта, создала условия при которых проявился мелкий/редкий баг в самом интерпретаторе (либо в коде DBI).

Не слишком смелая гипотеза?
Змагайся і адпачывай!

Ответить