2010-06-25 14 views
6

Her satırda ikinci değerin tarih olduğu bir günlüğü ayrıştıran bir Perl komut dosyası yazmayı deniyorum. Komut üç argüman alır: giriş günlük dosyası, başlangıç ​​zamanı ve bitiş zamanı. Başlangıç ​​ve bitiş zamanı, her bir satırdaki belirli bir değeri, bu iki zaman arasında düşecek şekilde ayrıştırmak için kullanılır. Fakat bunu düzgün bir şekilde çalıştırmak için başlangıç ​​ve bitiş zamanlarını dönme zamanına dönüştürüyorum. Benim sahip olduğum sorun, log dosyasına karşı karşılaştırmak için döngüler 'i' değerini normal zamana dönüştürmektir. localtime($i)'u çalıştırdıktan sonra değeri yazdırıyorum ve sadece gerçek değeri basmayan bir referans görüyorum. Ben sadece çekirdek Perl modüllerinin erişebilir vePerl'de zaman kavramını normal zamana nasıl dönüştürebilirim?

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 

: gibi

#!/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ış arar: Burada

var bugüne kadar script (devam eden bir çalışmadır) başkalarını yükleyemiyorum.

+0

bu ödev mi? Ve "başkalarını kuramaz" sadece okumadığınız anlamına gelir [Ama CPAN'ı kullanamıyorum!] (Http://www.shadowcat.co.uk/blog/matt-s-trout/but-i -cant-use-cpan /) – Ether

+0

Bu, iş için daha büyük bir komut dosyasının başlangıcıdır ve işim sadece çekirdek perl modüllerini kullanmama izin verecek. Perl kullanmaya başladık ve çekirdek modüller onaylandı ve başkalarını test ediyorlar, ancak bir modül kullanmayı ve onu kullanmasına izin vermekten üç aylık bekleme süresi var. –

+2

@Matt: Bu durumda özgeçmişinizi http://careers.stackoverflow.com adresine göndermenizi öneririm. – Ether

cevap

3

"Normal zamanda" tanımına bağlı olarak ctime, kullanabilirsiniz:

örnek kod:

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

Sonuç: Ayrıca

1279954921 
Sat Jul 24 03:02:01 2010 

, sen gerekmez Time :: Localtime (Perl'in dahili localtime dizisinden standart bir dizi/dize yerine which is why you get Time::tm) kullanın:

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

Yıldan 1900 çıkarmak için ihmal etmeyin!

Skaler bağlamda, localtime ve gmtime öğelerinin, ctime biçimli bir dizeyi döndürdüğünü unutmayın, böylece aşağıdaki gibi kullanabilirsiniz. Bu uygun değilse, POSIX modülünden strftime'u kullanmak isteyebilirsiniz. çıktının

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

Kuyruk:

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
İlgili konular