使用perl检查文本文件内容

时间:2015-12-10 14:47:07

标签: perl

我正在寻求关于此代码效率的一些反馈,以及如何移动@FilesToUse数组中的合格文件。

我正在将目录中的所有文件加载到@FilesToUse数组。然后,我需要检查每个文件,看看第7行是否说“BATCH”,如果它确实我想移动文件,然后从@FilesToUse数组中删除文件名,所以当我稍后使用该数组时,它没有BATCH文件名在里面。我希望我能清楚地说出这个问题。

文本文件大约是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;
          }
       }

2 个答案:

答案 0 :(得分:0)

  

如何从@FilesToUse数组中删除合格文件

我们可以使用splice从数组中删除元素,但我们需要数组索引 您可以将外循环更改为

       foreach $findex (-$#FilesToUse..0)  #Loop at the file level
       {
           $FileToUse = $FilesToUse[-$findex];

并插入

                splice @FilesToUse, -$findex, 1;

要删除文件元素。
(数组从最后一个元素处理到第一个元素,以避免删除索引时出现“缺失元素综合症” - 另请参阅How do I completely remove an element from an array?

答案 1 :(得分:-1)

我会清理语义:

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