2016-08-16 173 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已经存在。