2008-09-16 7 views
4

Dies hat mich verwirrt. Dieser Code funktionierte auf einem anderen Server, aber Perl v5.8.8 mit Date::Manip, das heute von CPAN geladen wurde, schlägt fehl.Perl: Verwendung von nicht initialisierten Wert in numerischen lt (<) um /Date/Manip.pm

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 

Der Code, der einfach Fehler lautet:

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); 
} 

Das ist richtig; Date::Manip schlägt für "today" fehl.

Die Linie in Date::Manip, das ist versagt:

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 

So wird Date::Manip davon aus, dass $Cnf mit Elementen "ConvTZ" oder "TZ" initialisiert wurde. Diese werden in Date_Init initialisiert, so dass darauf geachtet werden müsste.

Es ist nur in meinem großen Programm fehlgeschlagen. Wenn ich nur "getdate()" über extrahiere und es eigenständig laufe, gibt es keinen Fehler. Es gibt also etwas über die globale Umgebung, die sich auf diese auswirkt.

Dies scheint ein bekanntes, aber nicht verstandenes Problem zu sein. Wenn Sie Google nach "Verwendung von nicht initialisiertem Valutadatum manipulieren" suchen, gibt es ungefähr 2400 Treffer. Dieser Fehler wurde mit MythTV und grepmail gemeldet.

+0

Es ist schwer, Ihren Code zu lesen. Wenn Sie sicherstellen, dass Sie den Code einfügen, sodass jede Zeile mit einem Tab oder mindestens 3 Leerzeichen beginnt, wird es besser formatiert. –

+0

Ich glaube, es muss 4 Räume sein. ("Fünf ist richtig.") –

Antwort

2

Es ist fast sicher, dass Ihr Host keine Definition für die von Ihnen angegebene Zeitzone hat, was dazu führt, dass ein Wert nicht definiert wird.

Haben Sie überprüft, ob eine TZ-Definitionsdatei mit dem gleichen Namen tatsächlich auf dem Host vorhanden ist?

0

Datum :: Manip soll in sich abgeschlossen sein. Es hat eine Liste aller seiner Zeitzonen in einer eigenen Quelle, nach "$ zonesrfc =".

-2

Können Sie versuchen, den Debugger einzeln zu durchlaufen, um zu sehen, was genau falsch läuft? Es könnte leicht% Zone sein, die falsch ist -% tz kann in Zeile 1 oder 2 korrekt gesetzt werden, aber dann schlägt die Suche in Zeile 3 fehl und endet mit undef.

Bearbeiten:% Datum :: Manip :: Cnf und% Datum :: Manip sind :: Zone sind globale Variablen, so dass Sie in der Lage sein sollten, ein Dump von ihnen vor und nach dem Aufruf von Date :: Manip :: Datum_Init. Wenn ich die Quelle richtig lese, sollte% Cnf vor dem Aufruf von Date_Init ein Grundskelett von Konfigurationsoptionen enthalten, und% Zone sollte leer sein. Nach Date_Init sollte TZ den von Ihnen gewählten Wert haben, und% Zone sollte mit einer Nachschlagetabelle für Zeitzonen gefüllt sein.

Ich sehe einen Verweis auf .DateManip.cnf in% Cnf, was vielleicht etwas zu sehen ist - ist es möglich, dass Sie eine solche Datei in Ihrem Home-Verzeichnis haben, oder das aktuelle Arbeitsverzeichnis, das den Standard überschreibt die Einstellungen?

3

Es ist eine bug in Date :: Manip Version 5.48-5.54 für Win32. Ich hatte Schwierigkeiten, Standard/Tageslicht-Varianten von Zeitzonen zu verwenden, z. "EST5EDT", "US/Eastern". Die einzigen Zeitzonen, die zu funktionieren scheinen, sind solche ohne Tageslichteinsparung, z.B. 'EUROPÄISCHE SOMMERZEIT'.

Es ist möglich, Zeitzone Umwandlungsverarbeitung im Date :: Manip Modul zu deaktivieren:

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

Diese unerwünschte Nebenwirkungen haben, wenn Sie Termin richtig behandeln. Ich würde diese Problemumgehung nicht verwenden, außer Sie sind sicher, dass Sie niemals Daten aus verschiedenen Zeitzonen verarbeiten werden.

Verwandte Themen