如何使用Perl的grep通过匹配其名称中的模式来查找特定文件
我有一个存储在Perl变量中的字符串,该变量应该与存储在目录中的文件名的开始部分匹配。如何使用Perl的grep通过匹配其名称中的模式来查找特定文件
我使用这个变量从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);
不起作用。
${patt}*\.hdf
表示“出现0次或多次出现$ patt,接着是.hdf”。你确定你不是指“$ patt,随后是任意文本,后面是.hdf”吗?
那将是/${patt}.*\.hdf/
。
我想你想找到目录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.......
}
我想知道你是否需要grep。如果'patt'只是来自另一个文件名的非特殊字符,那么不会有'glob'$ patt * .hdf“'这样做吗? – 2012-04-11 14:21:23
是的,但'glob'在循环中运行时丢失了替代文件,所以我不得不退回到grep – srsci 2012-04-11 14:30:04
另外,如果我这样做:'$ patt = substr(basename($ _),0,$ ind);我的@ file2 = grep {basename($ _)=〜/^\ Q $ patt /} glob ;'它似乎不起作用。 '$ _'仍然保留从第一个文件夹“A”中读取的第一个文件名。那么,如何将'glob'的输出传递给'grep'呢?还有一件事是,PERL强迫我在'basename'中使用'$ _',否则会引发错误。对不起,我是PERL的一个小老鼠,所以我的一些问题可能听起来很愚蠢。 – srsci 2012-04-11 14:41:09
是的,我想匹配'$ {patt}'后跟一个或多个字符,然后'.hdf',所以谢谢我得到了那部分。但是当我改变我的行时,如下所示:'$ file2 = grep {/${patt}.*\.hdf}/} readdir(DIR);'它仍然没有拿起文件。其他事情出错了。 – srsci 2012-04-11 14:03:42
不要抱歉我的错误。它有效,我在那里有一个额外的'}',所以这是造成这个问题。非常感谢。我学到了一些新东西。 – srsci 2012-04-11 14:05:46