我需要在目录的所有文件上执行我的脚本(搜索).以下是有效的方法.我只是问哪个是最好的. (我需要表单的文件名:parsedchpt31_4.txt)
水珠:
my $parse_corpus; #(for all options) ##glob (only if all files in same directory as script?): my @files = glob("parsed"."*.txt"); foreach my $file (@files) { open($parse_corpus,'<',"$file") or die $!; ... all my code... }
Readdir with while和条件:
##readdir: my $dir = '.'; opendir(DIR,$dir) or die $!; while (my $file = readdir(DIR)) { next unless (-f "$dir/$file"); ##Ensure it's a file next unless ($file =~ m/^parsed.*\.txt/); ##Ensure it's a parsed file open($parse_corpus,"$file") or die "Couldn't open directory $!"; ... all my code... }
Readdir with foreach和grep:
##readdir+grep: my $dir = '.'; opendir(DIR,$dir) or die $!; foreach my $file (grep {/^parsed.*\.txt/} readdir (DIR)) { next unless (-f "$dir/$file"); ##Ensure it's a file open($parse_corpus,"$file") or die "Couldn't open directory $!"; ... all my code... }
文件::查找:
##File::Find my $dir = "."; ##current directory: could be (include quotes): '/Users/jon/Desktop/...' my @files; find(\&open_file,$dir); ##built in function sub open_file { push @files,$File::Find::name if(/^parsed.*\.txt/); } foreach my $file (@files) { open($parse_corpus,"$file") or die $!; ...all my code... }
还有另外一种方法吗?将我的整个脚本包含在循环中是否合适?可以,我不使用closedir吗?我把它传递给其他人,我不确定他们的文件将在哪里(可能无法使用glob)
非常感谢,希望这是一个正确的问题.
解决方法
最好或最有效的方法取决于您的目的和更大的背景.在原始速度,代码简单性或其他方面,你的意思是最好的吗?我怀疑内存考虑应该推动这种选择.目录中有多少个文件?
纯粹的实用性,glob方法运作得相当好.在诉诸任何涉及的事情之前,我会问是否有问题.
如果你能够使用其他模块,另一种方法是让别人担心肮脏的细节:
use File::Util qw(); my $fu = File::Util->new; my @files = $fu->list_dir($dir,qw(--with-paths --files-only));
请注意,File :: Find执行递归搜索,下降到所有子目录.很多时候你不想要或不需要它.
我还要补充一点,我不喜欢你的两个readdir例子,因为它们混合了不同的功能:(1)获取文件名,(2)处理单个文件.我会将这些工作分开.
my $dir = '.'; opendir(my $dh,$dir) or die $!; # Use a lexical directory handle. my @files = grep { -f } map { "$dir/$_" } grep { /^parsed.*\.txt$/ } readdir($dh); for my $file (@files){ ... }