用perl检查文本文件内容

用perl检查文本文件内容,perl,Perl,我正在寻求一些关于这段代码效率的反馈,以及如何在移动@filesuse数组时从该数组中删除符合条件的文件 我正在将目录中的所有文件加载到@filesuse数组中。然后我需要检查每个文件,看看第7行是否显示“批处理”,如果是,我想移动该文件,然后从@FilesToUse数组中删除该文件名,这样当我以后使用该数组时,该数组中就没有批处理文件名了。我希望我把这个问题说清楚 文本文件大约为10Mb,我通常每天要处理2个文件 提前感谢您的帮助 #Loop thru the files that were

我正在寻求一些关于这段代码效率的反馈,以及如何在移动@filesuse数组时从该数组中删除符合条件的文件

我正在将目录中的所有文件加载到@filesuse数组中。然后我需要检查每个文件,看看第7行是否显示“批处理”,如果是,我想移动该文件,然后从@FilesToUse数组中删除该文件名,这样当我以后使用该数组时,该数组中就没有批处理文件名了。我希望我把这个问题说清楚

文本文件大约为10Mb,我通常每天要处理2个文件

提前感谢您的帮助

 #Loop thru the files that were found and delete the one that is BATCH

       foreach $FileToUse (@FilesToUse)    #Loop at the file level
       {

open (FH, $TheInputDir . $FileToUse) or $MailMsg = $MailMsg . "ERROR: Could not open input file: $FileToUse \n";

          while (<FH>)                     # Loop at the line level within each file
          {
             $TheLine = $_;
             chomp($TheLine);
             $LineCnt++;

             if ( $LineCnt == 7 and substr( $TheLine, 1, 6 ) =~ /BATCH/ ) {

                move( "$TheInputDir$FileToUse", "$TheBatchMoveDir" )
                   or $MoveFail = 1;

                if ( $MoveFail == 1 ) {
                   $MailMsg = $MailMsg
                      . "ERROR: Failed to move $FileToUse to Batch folder!\n";
                }
                else {
                   $MailMsg
                      = $MailMsg . "Moved BATCH file $FileToUse to Batch folder\n";
                }
             }

             last if $. == 7;
          }
       }
#循环浏览找到的文件并删除批处理的文件
foreach$FileToUse(@FileToUse)#在文件级循环
{
打开(FH,$TheInputDir.$FileToUse)或$MailMsg=$MailMsg。“错误:无法打开输入文件:$FileToUse\n”;
while()#在每个文件的行级别循环
{
$THLINE=$\u3;
咀嚼($TheLine);
$LineCnt++;
如果($LineCnt==7,substr($TheLine,1,6)=~/BATCH/){
移动($TheInputDir$FileUse“,$TheBatchMoveDir”)
或$MoveFail=1;
如果($MoveFail==1){
$MailMsg=$MailMsg
“错误:无法将$FileUse移动到批处理文件夹!\n”;
}
否则{
$MailMsg
=$MailMsg。“已将批处理文件$fileuse移动到批处理文件夹\n”;
}
}
如果$.==7,则为最后一个;
}
}

我会清理语义:

         $LineCnt = $.;

         if ( $LineCnt == 7 ) {
            close FH;

            if ( substr( $TheLine, 1, 6 ) =~ /BATCH/ ) {

               move( "$TheInputDir$FileToUse", "$TheBatchMoveDir" )
                  or $MoveFail = 1;

               if ( $MoveFail == 1 ) {
                  $MailMsg = $MailMsg
                     . "ERROR: Failed to move $FileToUse to Batch folder!\n";
               }
               else {
                  $MailMsg
                     = $MailMsg . "Moved BATCH file $FileToUse to Batch folder\n";
               }
            }

            last;
         }
如何从@filesuse数组中删除符合条件的文件

我们可以使用从数组中删除元素,但我们需要用于此操作的数组索引。
您可以将外部循环更改为

foreach$findex($#filesuse..0)#在文件级循环
{
$FileToUse=$FilesToUse[-$findex];
并插入

splice@FilesToUse,-$findex,1;
要删除文件元素的位置。

(数组从最后一个元素到第一个元素进行处理,以避免删除索引时出现“缺少元素综合症”-另请参见)

输入文件的一个示例也会很有用。与其删除元素,不如先不将其添加到
@filesuse
。另外,您能为这个问题创建一个示例吗?