在Windows中的列分隔符上拆分

时间:2012-08-29 15:40:29

标签: windows perl cmd

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为中心的策略来抓取我需要的两个列?

2 个答案:

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