我對 perl 很陌生。我正在撰寫一個每天運行的腳本。我想檢查當前時間是否小于特定時間。我目前的解決方案是我從中提取然后hour
比較它。但我被告知要找到更好的解決方案。min
localtime
當前代碼:
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();
有時會意外回傳未定義的值并導致腳本失敗。所以我們要檢查是否定義了 $flag。如果它被定義,那么我們執行一些代碼并退出 for 回圈。否則我們檢查時間。如果時間小于 17:30,那么我們要等待一段時間并嘗試再次獲取 flag 的值。我只需要將比較當前時間的邏輯更改為 17:30
我想要我的東西:
} elsif ( $current_time <= 17:30 ) {
print STDOUT "Keep running till 17:30 \n";
sleep 300;
}
我如何實作這一目標?
uj5u.com熱心網友回復:
處理日期時間的好方法是使用好的庫,比如DateTime
my $dt_mark = DateTime
-> now(time_zone => 'local')
-> set(hour => 17, minute => 30);
for (;;) {
...
elsif ( DateTime->now(time_zone => 'local') <= $dt_mark ) {
...
可以避免為每次比較構建一個新物件,但這會使代碼更加復雜。請注意,這DateTime
是一個大型圖書館,這可能是一種矯枉過正。
如果目的確實只是將當前時間與固定的小時-??分鐘進行比較,那么也許
elsif ( $hour < 17 or ($hour == 17 and $min <= 30) )
夠好嗎?
或者形成和使用可以詞法比較的字串
elsif ( sprintf("dd", $hour, $min) lt '1730' )
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/483399.html
上一篇:VMware Workstaion-從零創建centos虛擬機
下一篇:如何獲取資料庫中存在的表的名稱