1

私はこのようなワンライナーを持っています:

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

それは言う:

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

エラーメッセージは「ファイルまたはディレクトリが見つかりません」を意味します。

日付からの出力とコマンドライン引数の両方を同時に取得する必要があります。

基本的に、現在の時間から引数から1を引いた値が得られるはずです。これを達成するためのより良い方法があれば、私は喜んでそれらを受け入れます。なぜこれがうまくいかないのかについての説明にはまだ感謝しています。

今は午前10時以降だとしましょう。

Param Output
    1     10
    2     09
    3     08
4

2 に答える 2

2

perl -n引数または引数がない場合はSTDINとしてリストされているファイルを読み取る暗黙のループを作成します。これは、別の何かに対する引数の使用と矛盾します。@ARGVBEGINブロックでクリアすることで修正できます。

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

しかし、この特定のタスクでは、とにかく完全にperlで日付計算を行う方が良いでしょう。

于 2012-06-08T08:31:05.560 に答える
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 ワンライナーは次のようにデパースします。

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

…だから-nARGV:

@ARGV でコマンドライン ファイル名を反復処理する特別なファイルハンドル。

ただし、引数としてファイル名はありません。

于 2012-06-08T08:03:02.583 に答える