2016-08-16 98 views
0

我已經得到了一個體面正常的​​腳本,並且很滿意迄今爲止的結果,這在很大程度上歸功於我在這裏找到的信息。Perl - 如何生成更新時間戳

但是,有一件事我看起來沒有正確的是時間戳。目前,我用這

use POSIX qw/strftime/; 
my $timestamp = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 

當我打電話$時間戳效果很好,只是,它永遠是對代碼的所有部分相同的時間戳(完全不更新)。

我試圖用一個子程序(這是我從來沒有做過)來解決這個問題:

sub GetLoggingTime { 
    use POSIX qw/strftime/; 
    my $LoggingTime = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime); 
    return $LoggingTime; 
} 

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

顯然這兩個打印和睡眠都嘗試,看看它是否是「更新」,它不是。兩個時間戳都在同一時間打印。

然後我試圖直接調用子程序,在子程序中添加打印並使用GetLoggingTime調用它,但是根本沒有任何操作(沒有輸出)。

我知道我可能錯過了一些明顯的東西,但我似乎無法找到它。有沒有一種簡單的方法來實現它的工作,或者有一種簡單的方法來獲取隨着腳本進展而實時更新的時間戳?

在此先感謝!

+3

你必須再次調用你的子程序才能更新數值:) – squiguy

回答

5

您不需要將use語句放入您的子例程中,該語句可以放在程序的頂部。

您的代碼:

my $timestamp = GetLoggingTime(); 

print "$timestamp \n"; 
sleep(2); 
print "$timestamp \n"; 

調用GetLoggingTime(),並儲存在內部$timestamp輸出。這意味着價值將在$timestamp內保持不變。如果你想獲得的每一次當前時間的輸出,你將不得不調用GetLoggingTime()每次需要更新的值時間:通過直接串聯的GetLoggingTime()的結果

my $timestamp = GetLoggingTime(); 
print "$timestamp \n"; 
sleep(2); 
$timestamp = GetLoggingTime(); 
print "$timestamp \n"; 

你能避免使用變量您字符串:

print GetLoggingTime() . " \n"; 
sleep(2); 
print GetLoggingTime() . " \n"; 

,或者如果你的時間戳記總是需要一個空格和換行,你可以包括內部GetLoggingTime()

sub GetLoggingTime { 
    return strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime) . " \n"; 
} 
+0

啊,謝謝你Drav--那正是我以後的樣子!我沒有意識到你可以直接在子程序上進行打印!我會假設我可以在另一個打印語句中根據需要通過進一步級聯調用它(例如,它不需要作爲打印字符串的第一部分來運行)。非常感謝您的幫助! – Kittamaru

+0

絕對正確,GetLoggingTime()返回一個包含字符串的「標量」,您可以按照您的選擇連接到任何其他字符串。 –

0

你可以使用tied variables來實現你想要的。但請注意,ing是Perl的一個相當深奧的角落,使用它會減慢你的程序。

我打算通過編寫一個簡單的綁定時間戳示例來演示。但似乎Tie::Scalar::Timestamp已經存在。