1

我有一个这样的单行:

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
4

2 回答 2

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 回答
2

perl -n如果没有参数,则创建一个隐式循环读取作为参数或 STDIN 列出的文件;这与您使用不同的论点相冲突。@ARGV您可以通过在 BEGIN 块中清除来修复它:

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

但是对于这个特定的任务,你最好还是完全在 perl 中进行日期计算。

于 2012-06-08T08:31:05.560 回答