使用Perl,参数不是数字错误

时间:2014-03-16 15:26:25

标签: perl

我从Learning Perl第6版的书中教自己Perl,我不明白我得到的错误。我正在编写一个程序,以YYYY-MM-DD格式报告当前目录中所有文件的访问和修改时间。在我的所有试验中,我一直在说错误

Argument "2014-03-16" isn't numeric in printf at ex17-3.pl line n.

其中n是包含printf调用的任何行。

最后,我只是将书的答案复制并粘贴到我的编辑器中并运行它,只是为了看到它有效,但这导致了同样的错误

Argument "2014-03-16" isn't numeric in printf at ex17-3.pl line 15.

这是代码

#!usr/bin/perl

use warnings;
use 5.012004;

foreach my $file (glob('*')) {
  my ($atime, $mtime) = map {
    my ($year, $month, $day) = (localtime($_))[5,4,3];
    $year += 1900;
    $month += 1;
    sprintf '%4d-%02d-%02d', $year, $month, $day;
  } (stat $file)[8,9];
  printf "%-20s %10d %10d\n", $file, $atime, $mtime;
}

任何人都可以解释为什么我会收到此错误?它是我正在使用的Perl版本,也许?

2 个答案:

答案 0 :(得分:2)

$atime$mtime是字符串,但您尝试使用%d打印它们。我认为你应该用%s打印它们。 Printf无法弄清楚如何将日期字符串解释为数字,这是一个合理的错误,IMO。

答案 1 :(得分:1)

顺便说一句,通过使用核心库Time::Piece(从Perl 5.8版开始可用),您的代码可以简化一点:

#!usr/bin/perl

use Time::Piece;

use warnings;
use 5.012004;

foreach my $file (glob('*')) {
  my ($atime, $mtime) = map {
    localtime($_)->strftime("%Y-%m-%d")
  } (stat $file)[8,9];

  printf "%-20s %10s %10s\n", $file, $atime, $mtime;
}