Perl程序内如何指定多类特定格式文件作为处理对象?
Perl新手问题:指定特定格式文件列表处理
问题描述
我是Perl新手,现有如下代码:
my @files=<data/j*.*.txt>; if (@ARGV) { my $test=$ARGV[0]; $test=lc($test); print "Using $test instead\n"; @files=</data/$test*.*.txt>; print "Found @files instead\n"; } my $outfile='/data/w_c.txt'; my $lotfile='/data/completed.txt'; if (-e $outfile) { unlink $outfile; }
当前代码通过my @files=<data/j*.*.txt>;获取所有匹配j*.*的txt文件,但我希望仅处理以下几类文件:
j*.1.txtc*.3.1.txta*.a.b.txt- 其他类似格式文件
请问如何在程序内直接指定这类文件列表?我需要读取这些文件并提取其中的信息。
解决方案
方法1:直接指定多个glob匹配模式
Perl的glob函数(或<>操作符)支持同时传入多个匹配模式,用空格分隔。你可以直接把需要的格式都列出来:
# 默认匹配指定格式的文件 my @files = glob('data/j*.1.txt data/c*.3.1.txt data/a*.a.b.txt'); # 结合ARGV参数的情况(如果需要根据传入参数调整前缀) if (@ARGV) { my $test = lc($ARGV[0]); print "Using $test instead\n"; # 根据传入参数生成对应模式,示例:替换前缀部分 @files = glob("data/${test}*.1.txt data/${test}*.3.1.txt"); print "Found @files instead\n"; }
如果后续需要添加新的文件格式,直接在glob的参数里追加新的模式即可。
方法2:用正则表达式筛选文件
如果你的文件格式规则比较复杂,或者需要更灵活的匹配逻辑,可以先获取目录下所有txt文件,再用正则过滤出符合要求的:
my @all_txt_files = <data/*.txt>; # 筛选符合指定格式的文件 my @files = grep { /^data\/j.*\.1\.txt$/ || # 匹配j*.1.txt /^data\/c.*\.3\.1\.txt$/ || # 匹配c*.3.1.txt /^data\/a.*\.a\.b\.txt$/ # 匹配a*.a.b.txt # 在这里添加其他格式的正则规则 } @all_txt_files;
注意正则里的.需要转义成\.,否则会匹配任意字符。
读取文件并提取信息
拿到目标文件列表后,就可以循环读取每个文件处理了:
foreach my $file (@files) { # 打开文件,失败则报错退出 open my $fh, '<', $file or die "无法打开文件 $file: $!"; # 逐行读取文件内容 while (my $line = <$fh>) { chomp $line; # 去掉行尾换行符 # 这里写你的信息提取逻辑,示例:提取包含"target"的行内容 if ($line =~ /(target.*)/) { my $extracted = $1; # 处理提取到的内容,比如写入输出文件 open my $out_fh, '>>', $outfile or die "无法打开输出文件: $!"; print $out_fh "$extracted\n"; close $out_fh; } } close $fh; }
内容的提问来源于stack exchange,提问作者prad001
相关产品推荐
相关产品推荐

