Perl中grep里面的变量

时间:2012-04-02 12:58:12

标签: regex perl unix

我必须在Perl中的变量中搜索模式。 模式也需要在变量中。 这就是我所拥有的:

opendir(DIR,"reports/");
$poolname = $poolname."_";
@FILES= grep {/^$poolname\.[0-9]*.csv/} readdir(DIR);
@sorted= reverse sort @FILES;

我想要匹配的模式是poolname_ [0-9] * (我想在这里获取池的最新报告。[0-9] *是文件的unix时间戳)

但上述正则表达式并未按预期工作。 $ sorted [0]没有所需的文件名。 我可以知道上面的代码有什么问题吗?

1 个答案:

答案 0 :(得分:4)

假设在问题的片段之前的某个地方,有一个等同于:

的作业
my $poolname = "poolname";

然后你说你正在寻找:

poolname_[0-9]*          # Presumably, poolname_[0-9]*.csv in fact

但你的正则表达式正在搜索:

poolname_\.[0-9]*.csv    # Probably should have a backslash before the .csv

您所寻找的模式将与您的正则表达不匹配;删除\.以获得所需的结果。

opendir(DIR,"reports/") or die "$!";
@FILES  = grep { /^${poolname}_[0-9]*\.csv/ } readdir(DIR);
@sorted = reverse sort @FILES;
closedir(DIR);

给定包含文件的目录reports

x_1332827070.csv
x_1333366051.csv
x_1333A66051.csv
y_1332827070.csv

这个脚本:

#!/usr/bin/env perl
use strict;
use warnings;

my $poolname = "x";
opendir(DIR,"reports/") or die "$!";
my @FILES  = grep { /^${poolname}_[0-9]*\.csv/ } readdir(DIR);
my @sorted = reverse sort @FILES;
closedir(DIR);

print "$_\n" for @sorted;

产生输出:

x_1333366051.csv
x_1332827070.csv

如果这不是您所追求的,那么您的评论和您的问题会产生误导。