2008-09-16 7 views
4

이것은 제가 의문입니다. 이 코드는 다른 서버에서 작동했지만 오늘 CPAN에서 Date::Manip이로드 된 Perl v5.8.8에서는 실패했습니다. 실패한 것 코드Perl : 초기화되지 않은 값을 숫자 lt (<) /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 

는 단순히 : 맞아

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 개의 히트 수입니다. 이 오류는 MythTVgrepmail과 함께보고되었습니다.

+0

코드를 읽기가 어렵습니다. 각 줄이 탭 또는 최소 3 칸으로 시작되도록 코드를 붙여 넣으면 형식이 잘 지정됩니다. –

+0

4 칸이 필요하다고 생각합니다. ("5 명이 맞습니다.") –

답변

2

호스트에 지정한 시간대에 대한 정의가 없다는 것이 거의 확실합니다. 이는 값이 정의되지 않은 원인입니다.

동일한 이름의 TZ 정의 파일이 실제로 호스트에 있는지 확인 했습니까?

0

날짜 :: Manip은 자체 포함 된 것으로되어 있습니다. "$ zonesrfc ="다음에 자체 소스에 모든 시간대 목록이 있습니다.

-2

정확히 무슨 문제가 있는지 보려면 디버거를 한 단계 씩 실행해볼 수 있습니까? 그것은 % 영역이 잘못 될 수 있습니다 - % tz은 1 또는 2 행에서 올바르게 설정 될 수 있지만 3 행에서 조회가 실패하고 undef로 끝납니다.

편집 : % Date :: Manip :: Cnf 및 % Date :: Manip :: Zone은 전역 변수이므로 Date :: Manip ::에 대한 호출 전후에 덤프를 가져올 수 있어야합니다. Date_Init. 원본을 올바르게 읽으면 % Cnf에 Date_Init 호출 전에 구성 옵션의 기본 골격이 있어야하며 % Zone은 비어 있어야합니다. Date_Init 이후에는 TZ가 선택한 값을 가져야하며 % Zone은 시간대의 조회 테이블로 채워 져야합니다.

% Cnf에있는 .DateManip.cnf에 대한 참조를 볼 수 있습니다.이 파일은 홈 디렉토리 또는 현재 작업 디렉토리에있을 수 있습니다.이 파일은 기본 디렉토리를 덮어 씁니다 설정?

3

Win32의 경우 Date :: Manip 버전 5.48-5.54에서는 bug입니다. 시간대의 표준/주광 변종을 사용하는 데 어려움을 겪었습니다 (예 : 'EST5EDT', '미국/동부'. 작동하는 것으로 보이는 유일한 시간대는 일광 절약 시간제가 아닙니다. '동부 표준시'.

이 날짜에 시간대 변환 처리를 해제 할 수 있습니다 : Manip 모듈 : 올바르게을 날짜를 처리하는 경우

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

이 원하지 않는 부작용이있을 것이다. 다른 시간대의 날짜를 처리하지 않는다고 확신하지 않는 한이 해결 방법을 사용하지 않습니다.

관련 문제