Perl - 如何生成更新时间戳

Perl - How to generate an updating timestamp

我已经得到了一个正常运行的脚本,到目前为止我对它的结果很满意,这在很大程度上要感谢我在这里找到的信息。

但是,我似乎无法正确理解的一件事是时间戳。目前,我正在使用这个

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";

显然这两个打印和睡眠是为了尝试查看它是否是 "updating",它不是。两个时间戳同时打印。

然后我尝试直接调用子例程,在子例程中添加打印并使用 &GetLoggingTime 调用它,但这根本没有做任何事情(没有输出)。

我知道我可能遗漏了一些明显的东西,但我似乎找不到它。有没有简单的方法让它工作,或者有没有简单的方法来获取随着脚本的进行实时更新的时间戳?

提前致谢!

您不需要将 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";

或者如果您的时间戳始终需要 space 和换行符,您可以将其包含在 GetLoggingTime()

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

您可以使用 tied variables 实现您想要的效果。但请注意,tieing 是 Perl 的一个相当深奥的角落,使用它会减慢您的程序。

我打算通过编写一个简单的绑定时间戳示例来进行演示。但是好像Tie::Scalar::Timestamp已经存在了