Perl: использование неинициализированного значения в числовом lt (<) в /Date/Manip.pm - PullRequest
4 голосов
/ 17 сентября 2008

Это меня озадачило. Этот код работал на другом сервере, но он не работает на Perl v5.8.8 с Date :: Manip , загруженным из CPAN сегодня.

Warning:
Use of uninitialized value in numeric lt (<) at /home/downside/lib/Date/Manip.pm line 3327.
at dailyupdate.pl line 13
        main::__ANON__('Use of uninitialized value in numeric lt (<) at
/home/downsid...') called at
/home/downside/lib/Date/Manip.pm line 3327
        Date::Manip::Date_SecsSince1970GMT(09, 16, 2008, 00, 21, 22) called at
/home/downside/lib/Date/Manip.pm line 1905
        Date::Manip::UnixDate('today', '%Y-%m-%d') called at
TICKER/SYMBOLS/updatesymbols.pm line 122
        TICKER::SYMBOLS::updatesymbols::getdate() called at
TICKER/SYMBOLS/updatesymbols.pm line 439
        TICKER::SYMBOLS::updatesymbols::updatesymbol('DBI::db=HASH(0x87fcc34)',
'TICKER::SYMBOLS::symbol=HASH(0x8a43540)') called at
TICKER/SYMBOLS/updatesymbols.pm line 565
TICKER::SYMBOLS::updatesymbols::updatesymbols('DBI::db=HASH(0x87fcc34)', 1, 0, -1) called at
dailyupdate.pl line 149
        EDGAR::updatesymbols('DBI::db=HASH(0x87fcc34)', 1, 0, -1) called at
dailyupdate.pl line 180
        EDGAR::dailyupdate() called at dailyupdate.pl line 193

Код, который не работает, просто:

sub getdate()
{    my $err;                ## today
    &Date::Manip::Date_Init('TZ=EST5EDT');       
    my $today = Date::Manip::UnixDate('today','%Y-%m-%d'); ## today's date
    ####print "Today is ",$today,"\n";        ## ***TEMP***
    return($today);
}

Это верно; Date :: Manip не работает для "today".

Строка в Date :: Manip , которая не работает:

  my($tz)=$Cnf{"ConvTZ"};  
  $tz=$Cnf{"TZ"}  if (! $tz);  
  $tz=$Zone{"n2o"}{lc($tz)}  if ($tz !~ /^[+-]\d{4}$/);  

  my($tzs)=1;  
  $tzs=-1 if ($tz<0); ### ERROR OCCURS HERE  

Итак Date :: Manip предполагает, что $Cnf был инициализирован с элементами "ConvTZ" или "TZ". Они инициализируются в Date_Init, поэтому о них следует позаботиться.

Это сбой только в моей большой программе. Если я просто извлеку "getdate()" выше и запустить его в автономном режиме, нет ошибки. Так что есть что-то о глобальная среда, которая влияет на это.

Кажется, это известная, но не понятая проблема. Если вы ищете Google для «Использование неинициализированной манипуляции датой стоимости» насчитывает около 2400 обращений. Об этой ошибке сообщают MythTV и grepmail .

Ответы [ 4 ]

3 голосов
/ 03 октября 2008

Это ошибка в Date :: Manip версии 5.48-5.54 для Win32. У меня были трудности с использованием стандартных / дневных вариантов часовых поясов, например «EST5EDT», «США / Восток». Похоже, что работают только часовые пояса без летнего времени, например 'EST'.

В модуле Date :: Manip можно отключить обработку преобразования часового пояса:

Date::Manip::Date_Init("ConvTZ=IGNORE");

Это будет иметь нежелательные побочные эффекты, если вы правильно относитесь к датам . Я не буду использовать этот обходной путь, если вы не уверены, что никогда не будете обрабатывать даты из разных часовых поясов.

2 голосов
/ 17 сентября 2008

Почти наверняка у вашего хоста нет определения часового пояса, который вы указываете, что и является причиной того, что значение не определено.

Вы проверили, чтобы убедиться, что файл определения TZ с тем же именем действительно существует на хосте?

0 голосов
/ 17 сентября 2008

Можете ли вы попробовать пошагово пройти через отладчик, чтобы увидеть, что именно не так? Это может быть%% Zone, которая является неправильной -% tz может быть правильно установлен в строке 1 или 2, но тогда поиск в строке 3 завершается неудачно, заканчиваясь undef.

Редактировать:% Date :: Manip :: Cnf и% Date :: Manip :: Zone являются глобальными переменными, поэтому вы должны иметь возможность получить их дамп до и после вызова Date :: Manip :: Date_Init , Если я правильно прочитал исходный код,% Cnf должен содержать базовый каркас параметров конфигурации перед вызовом Date_Init, а% Zone должен быть пустым; после Date_Init TZ должен иметь выбранное вами значение, а% Zone должен заполняться справочной таблицей часовых поясов.

Я вижу ссылку на .DateManip.cnf в% Cnf, на которую можно посмотреть - возможно, у вас есть такой файл в вашем домашнем каталоге или в текущем рабочем каталоге, который переопределяет настройки по умолчанию

0 голосов
/ 17 сентября 2008

Date :: Manip должен быть автономным. Он имеет список всех своих часовых поясов в своем собственном источнике, следующий за "$ zonerfc =".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...