2

このプログラムを実行すると:

#!/usr/bin/perl -w

use File::Find;
use File::stat;
use Time::gmtime;
use Fcntl ':mode';

my %size = ();
my @directory = ('.');

find(
    sub {
        my $st = stat($File::Find::name) or die "stat failed for $File::Find::name : $!";
        if ( defined $st )
        {
            my $gm = gmtime $st->mtime;
            $size{$gm->year + 1900} += $st->blksize unless S_ISDIR($st->mode);
        }
        else
        {
            print "stat failed for ", $File::Find::name, ": $!\n";
        }
    },
    @directory);

foreach my $year (keys %size)
{
    print "$year ", $size{$year}, "\n";
}

私は得るstat failed for ./1128/00 : No such file or directory at ./size.pl line 13.。しかし、私がそれをリストすると、そこにあります:

# ls ./1128/00
03  05  07  09  12  14  18  20  22  24  27  29  32  34  37  40  43  45  47  50  52  54 57  59  63  65  67  69  75  78  81  83  85  88  90  92  95
04  06  08  11  13  15  19  21  23  25  28  31  33  35  39  41  44  46  48  51  53  55  58  61  64  66  68  71  77  79  82  84  86  89  91  93

.この質問のために削除した診断に基づいて、最初の 4 つのファイルとディレクトリと1128ディレクトリ (の親) を正常に統計することがわかります1128/00。常に同じファイルとディレクトリを正常に統計し、 で失敗し1128/00ます。なぜ失敗するのですか?

4

1 に答える 1

2

デフォルトでFile::Findchdir、再帰的に各ディレクトリに移動します。

このため、 の値に対して実行statすると、実際には存在しないファイルが検索されます。$File::Find::name./1128/00./1128/./1128/00

必要な動作を得るには、$_変数に対してファイル操作を実行するだけです。

my $st = stat($_) or die "stat failed for $_: $!";
于 2014-07-16T21:47:26.003 に答える