2012-04-02 89 views
0

我必须在Perl中搜索变量内的模式。 该模式也需要在变量内。 以下是我有:Perl中grep变量

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

这是Perl,而不是PERL。这不是一个缩写。 – 2012-04-02 12:59:58

+0

ok :)我认为这是实用的提取和报告语言 – gkns 2012-04-02 13:02:10

+1

你在脚本的顶部有'严格使用'和'使用警告'吗?一目了然,我没有看到任何错误,尽管我会将'poolname_'直接放入正则表达式中。 – 2012-04-02 13:05:17

回答

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 

如果这不是你所追求的,你的评论和你的问题是误导性的。

+0

x_1332827070.csv x_1333366051.csv等表示文件名的模式 – gkns 2012-04-02 13:20:20

+0

它与$ {poolname}一起工作。非常感谢 :) – gkns 2012-04-02 13:25:54