我正在寻求关于此代码效率的一些反馈,以及如何移动@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;
}
}
答案 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;
}