5

我想比较 Perl 中的当前时间和文件创建时间,但两者的格式不同。本地时间是这种格式:

22116291110813630

和文件创建时间是

Today, December 29, 2008, 2:38:37 PM

我如何比较哪个更大以及它们的区别?

4

4 回答 4

16

它甚至比使用 stat() 和 time()/localtime() 更容易。

my $diff = -M $filename;

-M 操作符返回文件的“年龄”(程序启动后的天数)。它记录在-X 函数下或perldoc -f -X.

于 2008-12-29T18:31:43.550 回答
14

如果要比较值,您可能希望使用从localtime标量上下文中获得的数字以及可以从中获得的 inode 更改时间stat

               ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
                  $atime,$mtime,$ctime,$blksize,$blocks)
                      = stat($filename);

在哪里:

                 0 文件系统的开发设备号
                 1 ino inode 编号
                 2模式文件模式(类型和权限)
                 3 nlink 文件的(硬)链接数
                 4 uid 数字 文件所有者的用户 ID
                 5 gid 文件所有者的数字组 ID
                 6 rdev 设备标识符(仅限特殊文件)
                 7 size 文件的总大小,以字节为单位
                 8 atime 自纪元以来的最后一次访问时间(以秒为单位)
                 9 mtime 自纪元以来的最后修改时间(以秒为单位)
                10 ctime 自纪元以来的 inode 更改时间(以秒为单位) (*)
                11 blksize 文件系统 I/O 的首选块大小
                12 块 实际分配的块数

所以你想要第 9 场:


$mtime = ( stat $filename )[9];
$current_time = time;

$diff = $current_time - $mtime;

于 2008-12-29T11:21:58.970 回答
3

localtime返回列表上下文中的值列表。请参阅本地时间文档perlcheat。在您的示例中,看起来所有这些都混合在一起。在标量上下文中,它返回一个格式化的字符串,如Mon Dec 29 03:16:33 2008. 在大多数平台上,文件 inode 更改时间将以stat自某个时期以来的秒数返回。您应该能够直接将其与time()( not localtime() ) 的结果进行比较。

于 2008-12-29T11:17:43.177 回答
0

这两个功能要感谢jimtut的回答。fileage 以整数形式打印文件从创建时开始的秒数,非常适合在 shell 中使用。fileage 是上述问题的答案,而 dataage 打印的文件内容与我一直在寻找的答案相同,我相信这些都会很有用。

function fileage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -C "'"${1:?Must provide a file name}"'"'
}

function dataage {
  perl -e 'printf "%i\n", 60 * 60 * 24 * -M "'"${1:?Must provide a file name}"'"'
}
于 2013-02-25T16:37:01.270 回答