Я пытаюсь записать сценарий Perl, который анализирует журнал, где на каждой строке второе значение является датой. Сценарий берет в трех аргументах: входной файл журнала, время начала и время окончания. Запуск и время окончания используется для парсинга определенного значения на каждой строке, что это падает между теми двумя разами. Но правильно выполнять это я преобразовываю запуск и время окончания ко времени эпохи. Проблема, которую я имею, состоит в том, что для преобразования циклов 'я' оцениваю назад нормальному времени для сравнения с файлом журнала. После выполнения localtime($i)
Я печатаю значение и только вижу ссылку, распечатанную не фактическое значение.
Вот сценарий, который я имею до сих пор (это - происходящая работа):
#!/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, и не может установить любых других.
Вы можете использовать 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 (, поэтому вы получаете Time :: tm вместо стандартного массива / строки из внутреннего localtime
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
Don Не забудьте вычесть из года 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