2010-06-25 46 views
6

Tôi đang cố gắng viết một tập lệnh Perl phân tích cú pháp nhật ký trong đó trên mỗi dòng, giá trị thứ hai là ngày. Kịch bản lệnh có ba đối số: tệp nhật ký đầu vào, thời gian bắt đầu và thời gian kết thúc. Thời gian bắt đầu và kết thúc được sử dụng để phân tích một giá trị nhất định trên mỗi dòng nằm giữa hai lần đó. Nhưng để chạy đúng cách này tôi đang chuyển đổi thời gian bắt đầu và kết thúc thành thời gian. Vấn đề tôi đang gặp phải là để chuyển đổi giá trị 'i' của vòng lặp trở lại thời gian bình thường để so sánh với tệp nhật ký. Sau khi chạy localtime($i) Tôi in giá trị và chỉ thấy một tham chiếu được in không phải giá trị thực.Làm cách nào để chuyển đổi thời gian epoch thành thời gian bình thường trong Perl?

Đây là kịch bản tôi có cho đến nay (nó là một công việc đang tiến):

#!/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"; 

Kết quả trông giống như:

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 

tôi chỉ có quyền truy cập vào lõi module Perl và không thể cài đặt bất kỳ người nào khác.

+0

là bài tập về nhà này? Và "không thể cài đặt bất kỳ người nào khác" chỉ đơn giản có nghĩa là bạn chưa đọc [Nhưng tôi không thể sử dụng CPAN!] (Http://www.shadowcat.co.uk/blog/matt-s-trout/but-i -cant-use-cpan /) – Ether

+0

Đây là khởi đầu của một tập lệnh lớn hơn cho công việc và công việc của tôi sẽ chỉ cho phép tôi sử dụng các mô-đun perl cốt lõi. Chúng tôi chỉ mới bắt đầu sử dụng Perl và các mô-đun lõi được phê duyệt và họ đang thử nghiệm những người khác, nhưng có thời gian chờ đợi ba tháng từ yêu cầu sử dụng một mô-đun và được phép sử dụng nó. –

+2

@Matt: trong trường hợp đó, tôi khuyên bạn nên gửi sơ yếu lý lịch của mình tới http://careers.stackoverflow.com. – Ether

Trả lời

3

Bạn có thể sử dụng ctime, tùy thuộc vào định nghĩa của bạn về "thời gian bình thường":

Ví dụ mã:

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

Kết quả:

1279954921 
Sat Jul 24 03:02:01 2010 

Ngoài ra, bạn không cần phải sử dụng Time :: Localtime (which is why you get Time::tm thay vì mảng/chuỗi chuẩn từ số localtime nội bộ của Perl):

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

Đừng quên trừ đi 1900 từ năm!

Hãy nhớ rằng trong ngữ cảnh vô hướng, localtimegmtime trả về một chuỗi được định dạng ctime, do đó bạn có thể sử dụng nó như sau. Nếu điều đó không phù hợp, bạn có thể muốn sử dụng strftime từ mô-đun POSIX.

#! /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"; 

Tail của đầu ra:

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
Các vấn đề liên quan