在程序逻辑中需要一些帮助

时间:2012-07-05 13:07:45

标签: perl file-find

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

    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是否一次占用一个数组,以便代码一次性考虑配置文件中的整行?或任何其他逻辑?

谢谢

1 个答案:

答案 0 :(得分: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电话中。它可能看起来很乱,但效果会更好。