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) 出力でどの文字をこぼす必要があるかを誰かが知っていますか?
  • または、分割するのに適したキャラクターがいない場合、必要な 2 つの列を取得するための Perl 中心の戦略はありますか?
4

2 に答える 2

4

このsplit関数には、分割する文字列の最大数を定義するオプションの 3 番目の引数があります。

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 に答える
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 に答える