我正在尝试读取配置文件并丢弃其中列出的目录,其中包含文件中提到的大小。到目前为止,我有这个 -
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是否一次占用一个数组,以便代码一次性考虑配置文件中的整行?或任何其他逻辑?
谢谢
答案 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电话中。它可能看起来很乱,但效果会更好。