2010-06-25 13 views
6

मैं एक पर्ल स्क्रिप्ट लिखने का प्रयास कर रहा हूं जो एक लॉग को पार करता है जहां प्रत्येक पंक्ति पर दूसरी पंक्ति तिथि होती है। स्क्रिप्ट तीन तर्कों में होती है: इनपुट लॉग फ़ाइल, प्रारंभ समय, और अंत समय। प्रारंभ और समाप्ति समय का उपयोग प्रत्येक पंक्ति पर एक निश्चित मूल्य को पार करने के लिए किया जाता है जो कि उन दोनों के बीच आता है। लेकिन इसे ठीक से चलाने के लिए मैं युग के समय की शुरुआत और समाप्ति समय को परिवर्तित कर रहा हूं। मेरी समस्या यह है कि लूप 'i' मान को लॉग फ़ाइल के विरुद्ध तुलना करने के लिए सामान्य समय पर सामान्य रूप से परिवर्तित करना है। 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 

मैं केवल कोर पर्ल मॉड्यूल की पहुंच है और

यहाँ स्क्रिप्ट मैं अब तक किया है (यह कार्य प्रगति पर है) किसी अन्य को स्थापित करने में असमर्थ हूं।

+0

इस होमवर्क है? और "किसी अन्य को स्थापित करने में असमर्थ" का अर्थ है कि आपने पढ़ा नहीं है [लेकिन मैं सीपीएएन का उपयोग नहीं कर सकता!] (Http://www.shadowcat.co.uk/blog/matt-s-trout/but-i -कंट-उपयोग-सीपीएन /) – Ether

+0

यह काम के लिए एक बड़ी लिपि की शुरुआत है, और मेरा काम केवल मुझे कोर पर्ल मॉड्यूल का उपयोग करने की अनुमति देगा। हमने अभी पर्ल का उपयोग करना शुरू कर दिया है और कोर मॉड्यूल अनुमोदित हैं और वे दूसरों का परीक्षण कर रहे हैं, लेकिन मॉड्यूल का उपयोग करने और इसे उपयोग करने की अनुमति देने के लिए तीन महीने प्रतीक्षा समय है। –

+2

@ मैट: उस मामले में मैं 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 

इसके अलावा, आप की जरूरत नहीं है पर्ल के आंतरिक localtime से मानक सरणी/स्ट्रिंग के बजाय टाइम :: लोकटाइम (which is why you get Time::tm) का उपयोग करें:

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

वर्ष से 1 9 00 घटाएं मत भूलना!

याद रखें कि स्केलर संदर्भ में, localtime और gmtimectime -formatted स्ट्रिंग देता है, ताकि आप इसे निम्न में उपयोग कर सकें। यदि यह अनुपयुक्त है, तो आप 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
संबंधित मुद्दे