我希望@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)>;
答案 0 :(得分:7)
使用
my @files = glob($pattern);
<...>
运算符已经过载了。具体来说,<$...>
被视为文件句柄。
答案 1 :(得分:4)
<>
可能意味着readline
或glob
,具体取决于它的使用方式。来自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 );