4

これは私を困惑させました。このコードは別のサーバーでは機能しましたが、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"orで初期化されていると想定しています"TZ"。これらは で初期化されるDate_Initため、対処する必要があります。

私の大規模なプログラムでのみ失敗しています。上記の" " を抽出getdate()してスタンドアロンで実行すると、エラーは発生しません。つまり、これに影響を与える地球環境について何かがあります。

これは既知の問題のようですが、理解されていません。「初期化されていない値の日付操作の使用」を Google で検索すると、約 2400 件のヒットがあります。このエラーはMythTVgrepmailで報告されています。

4

4 に答える 4

3

これは、Win32 用の Date::Manip バージョン 5.48-5.54のバグです。「EST5EDT」、「US/Eastern」など、タイムゾーンの標準/夏時間バリアントを使用するのに苦労しました。機能しているように見える唯一のタイムゾーンは、'EST' などの夏時間のないタイムゾーンです。

Date::Manip モジュールでタイムゾーン変換処理をオフにすることができます:

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

日付を正しく扱うと、望ましくない副作用が発生します。異なるタイムゾーンの日付を処理することがないと確信できる場合を除き、この回避策は使用しません。

于 2008-10-03T15:05:54.507 に答える
2

指定しているタイムゾーンの定義がホストにないことはほぼ確実です。これが、値が未定義になる原因です。

同じ名前のTZ定義ファイルが実際にホストに存在することを確認しましたか?

于 2008-09-16T20:33:33.427 に答える
0

Date::Manip は自己完結型であると想定されています。「$zonesrfc=」に続いて、独自のソースにすべてのタイム ゾーンのリストがあります。

于 2008-09-16T20:42:48.427 に答える
-2

デバッガーをシングルステップで実行して、何が問題になっているのかを正確に確認できますか?%Zoneが間違っている可能性があります。%tzは1行目または2行目で正しく設定されている可能性がありますが、3行目のルックアップは失敗し、undefになります。

編集:%Date :: Manip :: Cnfと%Date :: Manip :: Zoneはグローバル変数であるため、Date :: Manip::Date_Initの呼び出しの前後にそれらのダンプを取得できるはずです。ソースを正しく読み取った場合、Date_Initを呼び出す前に%Cnfに構成オプションの基本的なスケルトンが含まれているはずであり、%Zoneは空である必要があります。Date_Initの後、TZには選択した値があり、%Zoneにはタイムゾーンのルックアップテーブルが入力されている必要があります。

%Cnfに.DateManip.cnfへの参照がありますが、これは確認する必要があるかもしれません-ホームディレクトリまたは現在の作業ディレクトリにそのようなファイルがあり、デフォルト設定を上書きしている可能性はありますか?

于 2008-09-17T11:23:25.860 に答える