0

我正在尝试读取配置文件并丢弃其中列出的具有文件中提到的大小的目录。到目前为止,我有这个-

    open FILE, 'C:\reports\config.txt' or die $!;
my $size_req;
my $path;
my $sub_dir;
my $count;

my @lines = <FILE>;   
foreach $_ (@lines) 
{   



    my @line = split /\|/, $_; 

    if ($line[0] eq "size")
    {
        $size_req= $line[1];
        $size_req= ">".$size_req*1024;;

    }

    if ($line[0] eq "path")
    {
        $path= $line[1];

    }

    if ($line[0] eq "directories")
    {   my $aa;
        my $siz_two_digit;
        my $sub_dir;
        my $i;
        my $array_size=@line;
        **for($i=1; $i < $array_size; )**
        { 
        $sub_dir=$line[$i]; 
        print $sub_dir;
        print "\n";
        print $path;
                     print "\n";
        my $r1  =  File::Find::Rule->directory
                           ->name($sub_dir)
                           ->prune          # don't go into it
                           ->discard;       # don't report it

                my $fn  =  File::Find::Rule->file
                                       ->size( $size_req );

                           my @files  =  File::Find::Rule->or( $r1, $fn )
                                             ->in( $path);

                     print @files;
                    undef @files;
                      print @files;
                     $i++;
                     print "\n";
                     print "\n";
        }
    }

}

for 循环的问题在于 - 它很好地存储了要从数组中丢弃的所有子目录。但是,当它读取要丢弃的第一个目录的名称时,它不知道剩余的子目录并列出它们。当它到达第二个值时,它会忽略前一个值并列出它。

有谁知道 File|::Find::Rule 是否一次采用一个数组,以便代码一次考虑配置文件中的整行?或任何其他逻辑?

谢谢

4

1 回答 1

0

这段代码不符合你的想法:

my $r1  =  File::Find::Rule->directory
                   ->name($sub_dir)
                   ->prune          # don't go into it
                   ->discard;       # don't report it

您正在尝试将规则存储在标量中,但实际上您正在调用 Find::File::Rule 并将结果列表转换为整数(列表中的元素数)并将其存储在 $r1 中。

只需将整个调用放在 @files 调用中即可。它可能看起来很乱,但它会工作得更好。

于 2012-07-07T13:58:33.127 回答