【问题标题】:Variable inside grep in PerlPerl中grep内部的变量
【发布时间】:2012-04-02 21:29:15
【问题描述】:

我必须在 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] 没有所需的文件名。 请问上面的代码有什么问题吗?

【问题讨论】:

  • 这是 Perl,不是 PERL。这不是首字母缩写词。
  • ok :) 我以为是实用的提取和报告语言
  • 脚本顶部有use strict;use warnings; 吗?乍一看我没有发现任何问题,尽管我会将poolname_ 直接放入正则表达式中。
  • 请显示您的文件名列表。您将在$poolname 后面添加一个下划线,然后在正则表达式中搜索一个点。
  • 另外,$poolname 在脚本开头包含什么?

标签: regex perl unix


【解决方案1】:

假设问题中sn-p之前的某处,有一个赋值相当于:

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

如果这不是你所追求的,那么你的 cmets 和你的问题就会产生误导。

【讨论】:

  • x_1332827070.csv x_1333366051.csv 等表示文件名的模式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2014-02-16
相关资源
最近更新 更多