0
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 列出某些文件。我想获取访问日期(第一列)和文件名(最后一列)。许多文件名都有空格,所以我不能轻易地用空格分割。理想情况下,我应该在列分隔符上拆分。

  • 有谁知道我应该为这样的 Windows (XP) 输出添加什么字符来获取每个单独的列?
  • 或者,如果没有一个好的角色可以拆分,是否有以 Perl 为中心的策略来获取我需要的两列?
4

2 回答 2

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";
}
于 2012-08-29T15:45:19.930 回答
4

split函数有一个可选的第三个参数来定义您拆分的最大字符串数:

my ($date, $time, $ampm, $size, $name) = split /\s+/, $input, 5;

解析的输出dir是不明智的。您可以使用该函数在 Perl 中打开一个目录opendir并遍历条目:

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为更易读的格式。

于 2012-08-29T15:49:02.763 回答