Perl:将当前时间与特定时间进行比较

Perl: compare current time to a specific time to

我是 perl 的新手。我正在研究每天运行的脚本。我想检查当前时间是否小于特定时间。我目前的解决方案是从localtime中提取hourmin,然后进行比较。但我被告知要找到更好的解决方案。

当前代码:

my $flag;
for (;;) {
    $flag = GetValue();
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    if( $flag ) {
        #do action here
        last;
    } elsif ( $hour <= 17 ) {
        if( $min <=30 ) {
            print STDOUT "Keep running till 17:30 \n";
            sleep 300;
        } else {
            die "Error";
        }
    } else {
        die "Error";
    }
}

基本上,语句 $flag = GetValue(); 有时会意外地 returns 未定义值并导致脚本失败。所以我们要检查 $flag 是否定义。如果它被定义,那么我们执行一些代码并退出 for 循环。否则我们检查时间。如果时间小于 17:30 那么我们要等待一段时间并尝试再次获取标志的值。我只需要将比较当前时间的逻辑改成17:30

我想要我的东西:

} elsif ( $current_time <= 17:30 ) {
   print STDOUT "Keep running till 17:30 \n";
   sleep 300;
}

如何实现?

处理date-times的好方法是使用一个好的库,比如DateTime

my $dt_mark = DateTime
    -> now(time_zone => 'local')
    -> set(hour => 17, minute => 30);

for (;;) { 
   ...

   elsif ( DateTime->now(time_zone => 'local') <= $dt_mark ) {
      ...

可以避免为每次比较都构造一个新对象,但这会使代码更加复杂。请注意,DateTime 是一个大型图书馆,这可能有点矫枉过正。

如果目的确实只是将当前时间与固定时间进行比较 hour-minute 那么也许

elsif ( $hour < 17 or ($hour == 17 and $min <= 30) )

够好吗?

或者构成并使用可以进行词法比较的字符串

elsif ( sprintf("%02d%02d", $hour, $min) lt '1730' )

为了所述目的,可以这样做

my (undef, $min, $hour) = localtime(time);

这可能更清楚,因为它直接指示使用了 localtime return 的哪些部分。

也可以省略 time,根据 localtime

localtime EXPR
localtime
...
If EXPR is omitted, localtime uses the current time (as returned by time).