0

我有一个存储在 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);不工作。

4

2 回答 2

1

我认为您想*.hdf在目录 A 中查找文件名与$ind目录 B 中任何此类文件的第一个字符匹配的所有文件?

您应该使用其中一个globreaddir两个目录,但不能同时使用。在这种情况下glob似乎是最好的选择,因为它允许您*.hdf从 A 中选择所有文件,而无需使用正则表达式检查它们。

下面的程序似乎可以满足您的需要。$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.......
}
于 2012-04-11T14:16:51.720 回答
0

${patt}*\.hdf表示“$patt 出现 0 次或多次,后跟 .hdf”。您确定您的意思不是“$patt,后跟任意文本,后跟 .hdf”吗?

那将是/${patt}.*\.hdf/

于 2012-04-11T13:44:57.247 回答