我从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版本,也许?
答案 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;
}