2010-06-25 6 views
6

Я пытаюсь написать скрипт Perl, который анализирует журнал, где на каждой строке второе значение - дата. Скрипт принимает три аргумента: входной файл журнала, время начала и время окончания. Время начала и окончания используется для анализа определенного значения на каждой строке, которое находится между этими двумя моментами. Но для правильного запуска этого я конвертирую время начала и окончания в эпоху. Проблема, с которой я столкнулась, заключается в том, чтобы преобразовать значение цикла i в нормальное время для сравнения с файлом журнала. После запуска localtime($i) Я печатаю значение и вижу только ссылку, напечатанную не фактическое значение.Как преобразовать время в обычное время в Perl?

Вот сценарий, я до сих пор (это работа в процессе):

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

Выход выглядит следующим образом:

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 

Я только иметь доступ к основным модулям Perl и Я не могу установить какие-либо другие.

+0

Является ли это домашнее задание? И «невозможно установить какие-либо другие» просто означает, что вы не читали [Но я не могу использовать CPAN!] (Http://www.shadowcat.co.uk/blog/matt-s-trout/but-i -cant-use-cpan /) – Ether

+0

Это начало большого скрипта для работы, и моя работа позволит мне использовать основные модули perl. Мы только начали использовать Perl, и основные модули были одобрены, и они тестируют других, но есть три месяца ожидания от запроса на использование модуля и разрешение на его использование. –

+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 

Кроме того, вам не нужно use 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 год с года!

Помните, что в скалярном контексте localtime и gmtime возвращает ctime -форматированную строку, поэтому вы можете использовать ее, как описано ниже. Если это непригодно, вы можете использовать strftime с модуля 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"; 

Хвост выхода:

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