如何循环使用名称相似的文件?这个脚本只适用于第一个文件的第一行,我不明白原因。有更简单的方法吗? 创建此脚本是为了读取文件,并在其他文件中写入所有没有数字的行。
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;
}
}
}
}
答案 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中提供文件名列表。