我有一个存储在Perl变量中的字符串,该字符串应该与存储在目录中的文件名的开头部分相匹配。
我使用此变量使用Perl的grep从目录中查找与此模式匹配的文件。这就是我在做的事情:
opendir (DIR, "data/testroot/") or die "$!";
@file1 = <$f1/*.hdf>
foreach(@file1){
$patt = substr(basename($_),0,$ind);
$file2 = grep {/${patt}*\.hdf/} readdir(DIR);
#other code follows.......
}
closedir(DIR);
首先,我获取文件夹f1
中所有文件的列表,并将它们存储在数组@file
中。然后,对于@file1
中的每个条目,我提取前几个字符,将它们存储在$patt
中,然后尝试从另一个文件夹data/testroot/
中选择具有匹配的开始模式的类似文件在$patt
。
grep $file2 = grep {/${patt}*\.hdf/} readdir(DIR);
无效。
答案 0 :(得分:1)
我想你想找到目录A中的所有*.hdf
文件,其文件名与目录B中任何此类文件的第一个$ind
字符匹配?
您应该对两个目录使用glob
或readdir
,但不能同时使用两者。在这种情况下,glob
似乎是最好的选择,因为它允许您从A中选择所有*.hdf
文件,而无需使用正则表达式进行检查。
以下程序似乎可以满足您的需求。我已替换$f1
和$ind
的示例值。
use strict;
use warnings;
use File::Basename;
my $f1 = 'data';
my $f1 = 'data/testroot';
my $ind = 6;
foreach (glob "$f1/*.hdf") {
my $patt = substr(basename($_), 0, $ind);
my @match = glob "$f2/$patt*.hdf";
#other code follows.......
}
答案 1 :(得分:0)
${patt}*\.hdf
表示“0次或更多次出现$ patt,后跟.hdf”。你确定你不是指“$ patt,后跟任意文本,然后是.hdf”?
那将是/${patt}.*\.hdf/
。