Kam*_*yan 5 perl diff strftime stat
我想以与 linuxdiff命令显示的格式相同的格式显示时间。
D:\>diff -dub old.cfg new.cfg
--- old.cfg 2019-05-15 15:03:14.289950700 +0530
+++ new.cfg 2019-05-14 16:07:21.119695300 +0530
Run Code Online (Sandbox Code Playgroud)
我想将文件的上次修改时间显示为2019-05-15 15:03:14.289950700 +0530.
我用过,stat但我没有得到纳秒部分。Alo,需要给定格式的时区。我也试过Time::HiRes,但是无法得到。
my $dt = strftime("%Y-%m-%d %H:%M:%S", localtime((stat($old_file))[9]));
Run Code Online (Sandbox Code Playgroud)
它返回:2019-05-15 15:03:14。你能帮我附加其他信息吗?
我首先必须说,这并不准确。即使你的硬件可能支持纳秒分辨率,但当它返回到软件时,它已经落后了数百倍。(对于文件的时间戳,大概仅用作相对于其他文件的时间戳,这可能不太重要。)
话虽如此,我发现声明纳秒的唯一方法是使用系统工具,所以stat
my ($ts) = grep { /^\s*Access: [0-9]{4}/ } qx(stat $file);
$ts =~ s/^\s*Access:\s+//;
Run Code Online (Sandbox Code Playgroud)
或者,map也用作过滤器
my ($ts) = map { /^\s*Access:\s+([0-9]{4}.*)/ ? $1 : () } qx(stat $file);
Run Code Online (Sandbox Code Playgroud)
当然,这里的一个问题是我们必须解析输出;因此,请参阅您的手册页并测试您的stat,并且不要希望有太多的可移植性。留意系统变化,因为程序的输出格式可能会改变。但我在 Perl 中没有找到纳秒声明。
作为参考,在我的 CentOS 7 上(在 和bash下tcsh)
perl -we'$f=shift; print grep { /^\s*Access: [0-9]{4}/ } qx(stat $f)' file
Run Code Online (Sandbox Code Playgroud)
打印,用于随机文件
访问时间:2019-05-15 13:21:57.723987422 -0700
再说一次,“纳”秒根本不准确。
另一种选择,也许是更可靠的输出解析,是ls与其一起使用--full-time
my $ts = join ' ', (split ' ', qx(ls --full-time $file))[5..7];
Run Code Online (Sandbox Code Playgroud)
与往常一样,运行外部命令时要小心构建变量,并适当地引用和转义。String::ShellQuote是一个很好的工具。或者,除非特别需要,否则最好完全避免使用 shell。最好使用运行外部工具的模块来完成这一切。