06/24/2012 09:58 AM 0 Backup of deleted Report 20120622.xlk
08/20/2012 06:51 PM 28,160 deleted 9 2 Foundation Installs on March 7th.xls
08/20/2012 06:51 PM 31,232 deleted-Installations March 10.xls
08/20/2012 06:51 PM 37,821 deleted Support Process 1.0.pdf
08/20/2012 06:51 PM 57,344 deleted_Support_Process_3_18_2010 V2.vsd
嘿,伙计。我正在为一些文件系统分析编写Perl实用程序。我在Windows中使用DIR列出某些文件。我想获取访问日期(第一列)和文件名(最后一列)。许多文件名都有空格,所以我不能轻易地在空格上拆分。理想情况下,我应该拆分列分隔符。
答案 0 :(得分:4)
存在纯粹的Perl解决方案。 stat
函数可用于获取访问时间。
否则,您可以拆分空格:
#!/usr/bin/env perl
use strict;
use warnings;
while (<DATA>) {
chomp;
my ( $date, undef, undef, undef, $name ) = split " ", $_, 5;
print "$date: $name\n";
}
__DATA__
06/24/2012 09:58 AM 0 Backup of deleted Report 20120622.xlk
08/20/2012 06:51 PM 28,160 deleted 9 2 Foundation Installs on March 7th.xls
08/20/2012 06:51 PM 31,232 deleted-Installations March 10.xls
08/20/2012 06:51 PM 37,821 deleted Support Process 1.0.pdf
08/20/2012 06:51 PM 57,344 deleted_Support_Process_3_18_2010 V2.vsd
您可以使用unpack
消耗数据列式。
while (<DATA>) {
chomp;
my ( $date, $filename ) = unpack 'A10 x29 A*';
print "$date: $filename\n";
}
答案 1 :(得分:4)
split
函数有一个可选的第三个参数来定义你分割成的最大字符串数:
my ($date, $time, $ampm, $size, $name) = split /\s+/, $input, 5;
解析dir
的输出是不明智的。您可以使用opendir
函数在Perl中打开一个目录,并遍历条目:
open my $directory, $dirname or die;
while(defined(my $file = readdir $directory)) {
next if -d "$dirname/$file"; # skip directories
my $mtime = (stat "$dirname/$file")[9]; # we use the mtime (last modified)
printf "%10d %s", $mtime, $string;
}
您可以参考文档以获取stat
函数的更多选项,包括访问时间或文件大小的数组索引。时间以Unix时间(自1970年1月1日00:00开始的秒数)给出,但可以使用localtime
转换为更易读的格式。