2010-06-25 5 views
6

각 행에서 두 번째 값이 날짜 인 로그를 구문 분석하는 Perl 스크립트를 작성하려고합니다. 스크립트는 입력 로그 파일, 시작 시간 및 종료 시간이라는 세 가지 인수를 취합니다. 시작 및 종료 시간은 두 번 사이에있는 각 라인의 특정 값을 파싱하는 데 사용됩니다. 하지만 이것을 제대로 실행하려면 시작과 종료 시간을 에포크 시간으로 변환합니다. 내가 겪고있는 문제는 루프 'i'값을 로그 파일과 비교할 정상적인 시간으로 다시 변환하는 것입니다. localtime($i)을 실행 한 후에는 값을 인쇄하고 실제 값이 아닌 인쇄 된 참조 만 보게됩니다. 난 단지의 핵심 펄 모듈에 액세스 할 수 있으며Perl에서 기수 시간을 정상 시간으로 변환하려면 어떻게해야합니까?

Time::tm=ARRAY(0x8cbbd40) 
Time::tm=ARRAY(0x8cbc1a0) 
Time::tm=ARRAY(0x8cbbe80) 
Time::tm=ARRAY(0x8cbc190) 
Time::tm=ARRAY(0x8bbb170) 
Time::tm=ARRAY(0x8cbc180) 
Time::tm=ARRAY(0x8cbbf30) 
Time::tm=ARRAY(0x8cbc170) 
Time::tm=ARRAY(0x8cbc210) 
Time::tm=ARRAY(0x8cbc160) 
1275760356 1275760773 

: 같은

#!/usr/bin/perl 
use strict; 
use warnings; 
use Time::Local; 
use Time::localtime; 
use File::stat; 

my $sec = 0; 
my $min = 0; 
my $hour = 0; 
my $mday = 0; 
my $mon = 0; 
my $year = 0; 
my $wday = 0; 
my $yday = 0; 
my $isdst = 0; 

########################## 
# Get the engine log date 
########################## 
my $date = `grep -m 1 'Metric' "$ARGV[0]" | awk '{print \$2}'`; 
($year,$mon,$mday) = split('-', $date); 
$mon--; 

######################################### 
# Calculate the start and end epoch time 
######################################### 
($hour,$min,$sec) = split(':', $ARGV[1]); 
my $startTime = timelocal($sec,$min,$hour,$mday,$mon,$year); 
($hour,$min,$sec) = split(':', $ARGV[2]); 
my $endTime = timelocal($sec,$min,$hour,$mday,$mon,$year); 


my $theTime = 0; 
for (my $i = $startTime; $i <= $endTime + 29; $i++) { 
     #print "$startTime $i \n"; 

     $theTime = localtime($i); 

     #my $DBInstance0 = `grep "$hour:$min:$sec" "$ARGV[0]"`;# | grep 'DBInstance-0' | awk '{print \$9}'`; 
     #print "$DBInstance0\n"; 
     print "$theTime\n"; 
} 
print "$startTime $endTime \n"; 

출력은 같습니다 여기

내가 지금까지 가지고있는 스크립트입니다 (이 진행중인 작품입니다) 다른 사람을 설치할 수 없습니다.

+0

이 숙제인가? 그리고 "다른 사람들을 설치할 수 없다"는 것은 단순히 [당신은 [CPAN을 사용할 수 없습니다!] (http://www.shadowcat.co.uk/blog/matt-s-trout/but-i)를 읽지 않은 것을 의미합니다. -cant-use-cpan /) – Ether

+0

이것은 작업을위한 더 큰 스크립트의 시작이며, 필자의 작업은 코어 펄 모듈 만 사용하도록 허용 할 것이다. 우리는 방금 Perl을 사용하기 시작했으며 코어 모듈이 승인되었고 다른 모듈을 테스트하고 있지만 모듈 사용을 요청하고이를 사용할 수있게되기까지 3 개월의 대기 시간이 있습니다. –

+2

@Matt :이 경우 이력서를 http://careers.stackoverflow.com에 제출하는 것이 좋습니다. – Ether

답변

3

당신은 "표준 시간"의 당신의 정의에 따라 ctime을 사용할 수 있습니다

예제 코드 :

use Time::Local; 
use Time::localtime; 
my $time=timelocal(1,2,3,24,6,2010); 
print "$time\n"; 
$theTime = ctime($time); 
print "$theTime\n"; 

결과 : 또한

1279954921 
Sat Jul 24 03:02:01 2010 

, 당신은 할 필요가 없습니다 Time :: Localtime을 사용하십시오 (which is why you get Time::tm 표준 배열/문자열 대신 Perl의 내부 localtime) :

use Time::Local; 
my $time=timelocal(1,2,3,24,6,2010); 
print "$time\n"; 
$theTime = localtime($time); 
print "$theTime\n"; 

1279954921 
Sat Jul 24 03:02:01 2010 
2

올해의 1900을 빼는 것을 잊지 마십시오!

스칼라 컨텍스트에서 localtimegmtimectime 형식의 문자열을 반환하므로 다음과 같이 사용할 수 있습니다. 부적절한 경우 POSIX 모듈의 strftime을 사용할 수 있습니다. 출력의

#! /usr/bin/perl 

use warnings; 
use strict; 

use Time::Local; 

my $start = "01:02:03"; 
my $end = "01:02:05"; 
my $date = "2010-02-10"; 

my($year,$mon,$mday) = split /-/, $date; 
$mon--; 
$year -= 1900; 

my($startTime,$endTime) = 
    map { my($hour,$min,$sec) = split /:/; 
     timelocal $sec,$min,$hour,$mday,$mon,$year } 
    $start, $end; 

for (my $i = $startTime; $i <= $endTime + 29; $i++) { 
    print scalar localtime($i), "\n"; 
} 

print "$startTime $endTime \n"; 

꼬리 :

Wed Feb 10 01:02:26 2010 
Wed Feb 10 01:02:27 2010 
Wed Feb 10 01:02:28 2010 
Wed Feb 10 01:02:29 2010 
Wed Feb 10 01:02:30 2010 
Wed Feb 10 01:02:31 2010 
Wed Feb 10 01:02:32 2010 
Wed Feb 10 01:02:33 2010 
Wed Feb 10 01:02:34 2010 
1265785323 1265785325
관련 문제