循环使用类似名称的文件

时间:2014-07-08 07:48:22

标签: perl loops file-io dir

如何循环使用名称相似的文件?这个脚本只适用于第一个文件的第一行,我不明白原因。有更简单的方法吗? 创建此脚本是为了读取文件,并在其他文件中写入所有没有数字的行。

use Data::Dumper;
use utf8;
#read OUT_AM3.txt, OUT_MOV3.txt, OUT_TA3.txt

opendir (DIR, '.') or die "Couldn't open directory, $!";
my @files = readdir(DIR);
closedir DIR;

$out = "Res.txt";
open (O, ">>", $out);
binmode(O, "utf8");

@eti = ("AM3","TA3","MOV3");
for ($i = 0; $i < @eti; $i++){
      foreach $fh(@files){
            open($fh, "<", "OUT_$eti[$i].txt");
            binmode($fh, "utf8");

            while(defined($l = <$fh>)){
                if (!grep /\-?\d\.\d+/, $l){
                print O $l;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你不需要

for ($i = 0; $i < @eti; $i++)

因为它将在目录中找到的所有文件上循环三次。

此外,当循环@files时,它应该使用数组元素

  foreach my $file (@files) {
     -f $file or next;

     open(my $fh, "<", $file) or die $!;
     # ..
  }

答案 1 :(得分:0)

“但结果并不是很重要。我想知道如何打开目录中的每个文件而不总是写下文件的名称。”

如果我理解正确,你可能想要这个吗?

my @files = grep /OUT_.*/, glob("*");
print $_ . "\n" foreach @files;

或者如果您不介意使用模块。有File :: Find :: Rule

use File::Find::Rule;
my $rule =  File::Find::Rule->new;
$rule->file;
$rule->name( 'OUT_*' );
my @files = $rule->in( "." );

两者都会在@files中提供文件名列表。