0

I am trying to read a config file and discard the directories that are listed in there with size mentioned in the file. So far I have this-

    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";
        }
    }

}

The problem with the for loop is that- it stores all the subdirectories to be discarded from an array just fine. However, when it reads the name of the first directory to be discarded, it does not know about the remaining subdirectories and lists them too. When it goes to the 2 nd value, it ignores the previous one and lists that as well.

Does anyone know if the File|::Find::Rule takes an array at a time so that the code will consider entire line in the configuration file at once? or any other logic?

Thank you

1 Answers1

0

This code does not do what you think:

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

You are trying to store a rule in a scalar, but what you are actually doing is calling Find::File::Rule and converting the resulting list to an integer (the number of elements in the list) and storing that in $r1.

Just put the whole call in the @files call. It may look messy but it will work a whole lot better.

stark
  • 12,615
  • 3
  • 33
  • 50