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 实现您想要的效果。但请注意,tie
ing 是 Perl 的一个相当深奥的角落,使用它会减慢您的程序。
我打算通过编写一个简单的绑定时间戳示例来进行演示。但是好像Tie::Scalar::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 实现您想要的效果。但请注意,tie
ing 是 Perl 的一个相当深奥的角落,使用它会减慢您的程序。
我打算通过编写一个简单的绑定时间戳示例来进行演示。但是好像Tie::Scalar::Timestamp已经存在了