我已经获得了一个功能正常的脚本,并且对目前的结果感到满意,这在很大程度上要归功于我在这里找到的信息。
然而,我似乎无法做到的一件事是时间戳。目前,我正在使用此
use POSIX qw/strftime/;
my $timestamp = strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime);
效果很好,除了当我调用$ timestamp时,代码的所有部分始终是相同的时间戳(根本不更新)。
我试图通过一个子程序来解决这个问题(我之前从未做过):
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调用它,但它根本没有做任何事情(没有输出)。
我知道我可能错过了一些明显的东西,但我似乎无法找到它。有没有一种简单的方法可以让它工作,还是有一种简单的方法来获得一个随着脚本的进展实时更新的时间戳?
提前致谢!
答案 0 :(得分:6)
您不需要将use
语句放在子程序中,该语句可以放在程序的顶部。
您的代码:
my $timestamp = GetLoggingTime();
print "$timestamp \n";
sleep(2);
print "$timestamp \n";
调用GetLoggingTime()
,并将输出存储在$timestamp
中。这意味着该值将在$timestamp
内保持静态。如果您希望每次都获得当前时间的输出,则每次需要更新值时都需要调用GetLoggingTime()
:
my $timestamp = GetLoggingTime();
print "$timestamp \n";
sleep(2);
$timestamp = GetLoggingTime();
print "$timestamp \n";
您可以通过将GetLoggingTime()
的结果直接连接到字符串来避免使用变量:
print GetLoggingTime() . " \n";
sleep(2);
print GetLoggingTime() . " \n";
或者如果您的时间戳始终需要空格和换行符,则可以将其包含在GetLoggingTime()
sub GetLoggingTime {
return strftime('%m/%d/%Y %I:%M.%S %p %Z',localtime) . " \n";
}
答案 1 :(得分:1)
您可以使用tied variables实现所需目标。但请注意tie
是Perl的一个相当深奥的角落,使用它会减慢你的程序。
我打算通过编写一个简单的绑定时间戳示例来演示。但似乎Tie::Scalar::Timestamp已经存在。