如何在Perl中获取文件的最后修改时间?

假设我有一个文件句柄$fh 。 我可以用-e $fh检查它的存在,或者用-s $fh检查它的文件大小或者关于这个文件的附加信息 。 我怎样才能得到最后修改时间戳?

您可以使用内置模块File::stat (自Perl 5.004起包含)。

调用stat($fh)将返回一个数组,其中包含有关从(从stat的perlfunc手册页 )传入的文件句柄的以下信息:

  0 dev device number of filesystem 1 ino inode number 2 mode file mode (type and permissions) 3 nlink number of (hard) links to the file 4 uid numeric user ID of file's owner 5 gid numeric group ID of file's owner 6 rdev the device identifier (special files only) 7 size total size of file, in bytes 8 atime last access time since the epoch 9 mtime last modify time since the epoch 10 ctime inode change time (NOT creation time!) since the epoch 11 blksize preferred block size for file system I/O 12 blocks actual number of blocks allocated 

这个数组中的第九个元素将会给你自上个世纪( 格林尼治标准时间1970年1月1日00:00)的最后修改时间。 从那你可以确定当地时间:

 my $epoch_timestamp = (stat($fh))[9]; my $timestamp = localtime($epoch_timestamp); 

为避免前面示例中需要的幻数 9,另外使用另一个内置模块Time::localtime (也包括在Perl 5.004中)。 这需要一些(可以说)更清晰的代码:

 use File::stat; use Time::localtime; my $timestamp = ctime(stat($fh)->mtime); 

使用内buildstat函数。 或者更具体地说:

 my $modtime = (stat($fh))[9] 
 my @array = stat($filehandle); 

修改时间以Unix格式存储在$ array [9]中。

或明确地说:

 my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime, $mtime, $ctime, $blksize, $blocks) = stat($filepath); 0 dev Device number of filesystem 1 ino inode number 2 mode File mode (type and permissions) 3 nlink Number of (hard) links to the file 4 uid Numeric user ID of file's owner 5 gid Numeric group ID of file's owner 6 rdev The device identifier (special files only) 7 size Total size of file, in bytes 8 atime Last access time in seconds since the epoch 9 mtime Last modify time in seconds since the epoch 10 ctime inode change time in seconds since the epoch 11 blksize Preferred block size for file system I/O 12 blocks Actual number of blocks allocated 

这个时代是1970年1月1日00:00。

更多信息在stat

你需要统计调用,文件名:

 my $last_mod_time = (stat ($file))[9]; 

Perl也有不同的版本:

 my $last_mod_time = -M $file; 

但是这个价值是相对于程序开始的。 这对sorting等事情很有用,但是您可能需要第一个版本。

如果你只是比较两个文件,看哪个更新,那么-C应该工作:

 if (-C "file1.txt" > -C "file2.txt") { { /* Update */ } 

还有-M ,但我不认为这是你想要的。 幸运的是,通过Googlesearch这些文件操作员的文档几乎是不可能的。

你可以使用stat()或File :: Stat模块。

 perldoc -f stat 

我想你正在寻找stat函数(perldoc -f stat)

特别地,返回列表的第9个字段(第10个索引#9)是从历元开始的以秒为单位的文件的最后修改时间。

所以:

my $ last_modified =(stat($ fh))[9];

在我的FreeBSD系统上, stat只是返回一个祝福。

 $VAR1 = bless( [ 102, 8, 33188, 1, 0, 0, 661, 276, 1372816636, 1372755222, 1372755233, 32768, 8 ], 'File::stat' ); 

你需要像这样提取mtime

 my @ABC = (stat($my_file)); print "-----------$ABC['File::stat'][9] ------------------------\n"; 

要么

 print "-----------$ABC[0][9] ------------------------\n";