Perl 中 grep 内部的变量

gkn*_*kns 0 regex unix perl

我必须在 Perl 中的变量内搜索模式。该模式还需要位于变量内部。这是我所拥有的:

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

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

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

Jon*_*ler 5

假设在问题中的代码片段之前的某处,有一个相当于以下内容的赋值:

my $poolname = "poolname";
Run Code Online (Sandbox Code Playgroud)

然后你说你正在寻找:

poolname_[0-9]*          # Presumably, poolname_[0-9]*.csv in fact
Run Code Online (Sandbox Code Playgroud)

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

poolname_\.[0-9]*.csv    # Probably should have a backslash before the .csv
Run Code Online (Sandbox Code Playgroud)

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

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

给定一个reports包含文件的目录:

x_1332827070.csv
x_1333366051.csv
x_1333A66051.csv
y_1332827070.csv
Run Code Online (Sandbox Code Playgroud)

这个脚本:

#!/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;
Run Code Online (Sandbox Code Playgroud)

产生输出:

x_1333366051.csv
x_1332827070.csv
Run Code Online (Sandbox Code Playgroud)

如果这不是您想要的,那么您的评论和问题就会产生误导。