在perl中,是否有简洁的方法来组合glob和printf?

时间:2011-01-05 15:08:51

标签: perl printf glob

我希望@list包含$ root_dir中与 * YYYYMMDD * 匹配的所有文件名,其中YYYYMMDD是25小时前。

我试试......

my ($y, $m, $d) = (localtime(time - 25 * 60 * 60))[5,4,3]; 
my $pattern = sprintf('*%4d%02d%02d*',$y+1900,$m+1,$d);
print "The pattern is $pattern\n"; 
my @files = <$pattern>;
foreach (@files) {
    print "$_\n";
}

...但是我没有获取文件列表,而是在未打开的文件句柄上获得 readline()。

我知道&lt;&gt;运算符可以解释变量,因此&lt; $ y $ m $ d&gt;在一年的最后三个月中,三分之二的日子会有效,因为这些日期和日期都有两位数,但这并不健全。

我必须写...

$m = sprintf('%02d',$m+1);  
$d = sprintf('%02d',$d+1);
my @files = <*$y$m$d*>;

......还是有更简洁的东西?有点像...

# invalid code unless you want to produce the string "readline() on unopened filehandle" for some reason
my @files = <sprintf('*%4d%02d%02d*',$y+1900,$m+1,$d)>;

3 个答案:

答案 0 :(得分:7)

使用

my @files = glob($pattern);

<...>运算符已经过载了。具体来说,<$...>被视为文件句柄。

答案 1 :(得分:4)

<>可能意味着readlineglob,具体取决于它的使用方式。来自perlop:

  

如果尖括号包含的是一个简单的标量变量(例如<$foo>),   然后该变量包含要从其输入的文件句柄的名称   typeglob,或对[...]

的引用      

如果尖括号内的内容既不是文件句柄也不是简单的标量   变量包含文件句柄名称,typeglob或typeglob引用,它是   解释为文件名模式为globbed [...]

     

这种区别仅取决于句法原因。 [强调我的]

由于$pattern是一个简单的标量,因此它被解释为句柄,Perl尝试执行readline。直接致电glob

my @files = glob($pattern);

<>的超载可能有点令人困惑。如果你认为它是一种写作iterator->next的有趣方式,它可能会有所帮助。 ({1}}和readline都像标量上下文中的迭代器一样。)

答案 2 :(得分:3)

有点多余,而不是所有那些恶作剧,你可以使用CPAN的东西:

use File::Find::Rule;

my @files = File::Find::Rule->file->name( $pattern )->in( $root_dir );