2012-06-08 81 views
1

我有一個班輪這樣的:的perl -n從管道輸入和@ARGV

date +%H | perl -ne 'printf "%02d", $_ - ($ARGV[0] - 1);' 1 

它說:

Can't open 1: Datei oder Verzeichnis nicht gefunden. 

錯誤消息意味着「文件或目錄未發現」。

我希望它同時採用日期和命令行參數的輸出。

本質上它應該讓我當前小時減去參數減一。如果有更好的方法來實現這一點,我會高興地接受它們。我仍然很感激爲什麼這不起作用的解釋。

我們假設現在是上午10點以後。

Param Output 
    1  10 
    2  09 
    3  08 

回答

2

結果可能是昨天甚至更遠,過去只是打印時間沒有多大意義。

perl -mDateTime -e' 
    my $dt = DateTime->now; 
    $dt->subtract(hours => 1); 
    $dt->subtract(hours => shift @ARGV); 
    print $dt->hour; 
' 4 

儘可能使用標準的日期時間戳,例如廣泛使用的RFC3339。

perl -mDateTime -mDateTime::Format::RFC3339 -e' 
    my $dt = DateTime->now; 
    $dt->subtract(hours => 1); 
    $dt->subtract(hours => shift @ARGV); 
    print DateTime::Format::RFC3339->new->format_datetime($dt); 
' 4 

你的Perl的一行deparses到:

LINE: while (defined($_ = <ARGV>)) { 
    printf '%02d', $_ - ($ARGV[0] - 1); 
} 

...因爲-nARGV

在@ARGV中迭代命令行文件名的特殊文件句柄。

但是你沒有文件名作爲參數。

+0

謝謝。我需要它在shell腳本中命名日誌分析輸出文件。根據腳本運行的時間,它使用原始日誌文件中過去可變小時數的行。因爲被稱爲日期的方式不會是昨天。 – simbabque

+0

感謝您的解釋。現在它變得更有意義。 – simbabque

2

perl -n如果沒有參數,創建隱式循環讀取列爲參數或STDIN的文件;這與你使用不同的觀點相沖突。您可以通過在BEGIN塊清除@ARGV修復:

date +%H | perl -ne 'BEGIN{ $arg=shift } printf "%02d", $_ - ($arg - 1);' 1 

但對於這個特殊的任務,你最好完全在Perl做日期計算反正。

+0

這是有道理的。謝謝。 – simbabque