#!/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";
}
м... прошу прощения, но это точно тот код...? Если б вместо Dumper($db_ent->{'OPTIN'}, "\n"; было Dumper($db_ent->{`OPTIN`}, "\n"; - это многое бы объясняло.
Кстати, попробуйте с двойными кавычками
Опыт растет прямо пропорционально выведенному из строя оборудованию
В том-то и фишка, что код в точности тот.
Более того, в процессе отладки использовалась аналогичная конструкция для NUMBER -- в ней и с кавычками и без кавычек честно виделся номер.
А опечататься столько раз я не мог -- собственно приведенный скрипт это уже результат черт-те какого этапа диагностики скрипта, где оригинальная ошибка возникла.
Совершенно точно -- добавление/удаление одинарных кавычек вокруг литерала приводит к переключению распознавания/нераспознавания поля. Для данного конкретного объекта в данном конкретном участке кода.
Точнее, закономерность воспроизводима на 90%. В оставшихся 10% случаев ошибка кратковременно исчезает, хотя действия (включение-выключение дампера) абсолютно тривиальны и ничем не отличаются от действий в остальных случаях.
Что характерно, удаление вызовов дампера из работающего скрипта немедленно восстанавливало ошибку, даже если она была в состоянии "кратковременного исчезновения".
Окружающий код сделан не лучшим образом (не мной), там достаточно много require-ов самопальных модулей, смешан модульный, объектный и библиотечный подход....
Но тем не менее интересно -- что в принципе могло привести к такому мистическому поведению перла?
Руки чешутся предположить, что конкретная хаотическая комбинация use и require имеющая место в начале скрипта, создала условия при которых проявился мелкий/редкий баг в самом интерпретаторе (либо в коде DBI).