Perl 如何让grep只扫描文件名中的前12个字符?

Perl 如何让grep只扫描文件名中的前12个字符?,perl,grep,Perl,Grep,我正在尝试按文件名筛选文件 要求您输入两个日期,然后我的代码遍历所有文件,并将符合搜索参数的所有文件写入数组 但是如果我输入了一个不准确的范围,比如2014年。。2016年,与我的搜索无关的文件(因为我只想grep前8个字符,因为它们代表一个日期戳)也会被过滤,比如@files中的前两个文件,因为它们的名称中包含2014、2015或2016 @files = 20120830_600020143_1_Log.csv (wrong because year 2012) 20130

我正在尝试按文件名筛选文件

要求您输入两个日期,然后我的代码遍历所有文件,并将符合搜索参数的所有文件写入数组

但是如果我输入了一个不准确的范围,比如2014年。。2016年,与我的搜索无关的文件(因为我只想grep前8个字符,因为它们代表一个日期戳)也会被过滤,比如
@files
中的前两个文件,因为它们的名称中包含2014、2015或2016

@files = 20120830_600020143_1_Log.csv (wrong because year 2012)
         20130830_600020161_1_Log.csv (wrong because year 2013)
         20150830_600020162_1_Log.csv
         20160830_600020121_1_Log.csv
如何仅grep文件名的前12个字符

我曾想过与
substr
混合使用,但无法使其发挥作用

这是我需要更改的代码。在这种情况下,
$daterange
“2016”


听起来您只想搜索每个文件名的前八个字符。看起来像这样

my @files = grep { substr($_, 0, 8) =~ $daterange } readdir $dir_b;
foreach $folder ( @folder ) {

    my $curdir = "$scriptdir\\$folder";

    opendir my $dh, $curdir or die qq{Unable to open directory "$curdir": $!};

    while ( my $node = readdir $dh ) {

        next if $node eq '.' or $node eq '..';
        next unless substr($node, 0, 8) =~ $daterange;

        my $fn = "$curdir\\$node";
        next unless -f $fn;

        # Do stuff with $fn
    }
}
我更喜欢在
while
循环中使用
readdir
,如下所示

my @files = grep { substr($_, 0, 8) =~ $daterange } readdir $dir_b;
foreach $folder ( @folder ) {

    my $curdir = "$scriptdir\\$folder";

    opendir my $dh, $curdir or die qq{Unable to open directory "$curdir": $!};

    while ( my $node = readdir $dh ) {

        next if $node eq '.' or $node eq '..';
        next unless substr($node, 0, 8) =~ $daterange;

        my $fn = "$curdir\\$node";
        next unless -f $fn;

        # Do stuff with $fn
    }
}

“/$daterange/”到“^$daterange/”?^regex=惊人的事情。帮助您的巨大资源是的,^只在文件名开头查找2016,对吗?不知何故,这让我想到了可能导致的错误,但我找不到任何错误,只要namesyntax是相同的。谢谢我不清楚为什么。。2016年是“一个不准确的范围”?因为用户不会(或至少不应该)扫描如此大量的数据。它打算扫描几天或几周,如20160801。。20160901而不是几年前,这就是我写“不准确的范围”时的意思,也许用这个词来描述我的意思是错误的:)