如何使用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/

+0

是的,我想匹配'$ {patt}'后跟一个或多个字符,然后'.hdf',所以谢谢我得到了那部分。但是当我改变我的行时,如下所示:'$ file2 = grep {/${patt}.*\.hdf}/} readdir(DIR);'它仍然没有拿起文件。其他事情出错了。 – srsci 2012-04-11 14:03:42

+0

不要抱歉我的错误。它有效,我在那里有一个额外的'}',所以这是造成这个问题。非常感谢。我学到了一些新东西。 – srsci 2012-04-11 14:05:46

我想你想找到目录A中的所有*.hdf文件,它们的文件名与目录B中任何这样的文件的第一个$ind字符匹配?

对于这两个目录,您都应该使用globreaddir,但不能同时使用两者。在这种情况下,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....... 
} 
+0

我想知道你是否需要grep。如果'patt'只是来自另一个文件名的非特殊字符,那么不会有'glob'$ patt * .hdf“'这样做吗? – 2012-04-11 14:21:23

+0

是的,但'glob'在循环中运行时丢失了替代文件,所以我不得不退回到grep – srsci 2012-04-11 14:30:04

+0

另外,如果我这样做:'$ patt = substr(basename($ _),0,$ ind);我的@ file2 = grep {basename($ _)=〜/^\ Q $ patt /} glob ;'它似乎不起作用。 '$ _'仍然保留从第一个文件夹“A”中读取的第一个文件名。那么,如何将'glob'的输出传递给'grep'呢?还有一件事是,PERL强迫我在'basename'中使用'$ _',否则会引发错误。对不起,我是PERL的一个小老鼠,所以我的一些问题可能听起来很愚蠢。 – srsci 2012-04-11 14:41:09