在perl中,是否有一种简洁的方式来组合glob和printf?
我希望@list包含$root_dir中与*YYYYMMDD*匹配的所有文件名,其中YYYYMMDD是25小时前的文件名 我试着在perl中,是否有一种简洁的方式来组合glob和printf?,perl,printf,glob,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>; for
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";
}
my($y,$m,$d)=(localtime(time-25*60*60))[5,4,3];
我的$pattern=sprintf(“*%4d%02d%02d*”,$y+1900,$m+1,$d);
打印“图案为$pattern\n”;
我的@files=;
foreach(@files){
打印“$\u\n”;
}
。。。但我没有得到文件列表,而是在未打开的文件句柄上得到readline()
我知道操作员可以解释变量,所以在一年的最后三个月的三分之二的天数内都会工作,因为这些月份和天数都有两位数,但这并不可靠
我必须写
$m = sprintf('%02d',$m+1);
$d = sprintf('%02d',$d+1);
my @files = <*$y$m$d*>;
$m=sprintf('%02d',$m+1);
$d=sprintf('%02d',$d+1);
我的@files=;
。。。还是有更简洁的?类似于
# 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)>;
#无效代码,除非出于某种原因希望在未打开的文件句柄上生成字符串“readline()”
我的@files=;
使用
操作符已经过载了。具体来说,
被视为一个文件句柄。有点多余,您可以使用CPAN中的一些东西来代替所有这些恶作剧:
use File::Find::Rule;
my @files = File::Find::Rule->file->name( $pattern )->in( $root_dir );
可以表示readline
或glob
,具体取决于它的使用方式。来自perlop:
如果尖括号中包含的是一个简单的标量变量(例如,
),
然后,该变量包含要从中输入的文件句柄的名称,或其
typeglob,或对相同[…]的引用
如果尖括号内的内容既不是文件句柄,也不是简单的标量
包含filehandle名称、typeglob或typeglob引用的变量,它是
解释为要全局化的文件名模式[…]
这种区别仅仅是基于句法上的原因。[我的重点]
由于$pattern
是一个简单的标量,因此它被解释为一个句柄,Perl尝试执行读取行
。直接调用glob
:
my @files = glob($pattern);
的重载可能有点令人困惑。如果您认为它是一种编写iterator->next
的有趣方式,那么它可能会有所帮助。(在标量上下文中,readline
和glob
都像迭代器一样工作。)感谢您对如何重载的详细说明。my@files=;或者,当一个简单的glob
将完成任务时,没有理由使用File::Find::Rule
。您的代码搜索$root\u dir
的所有子目录,而原始代码没有搜索。@cjm:您可以使用额外的十个字符轻松禁用它,并获得不必处理全局细微差别的额外好处。列表上下文全局完全满足此处的需要;唯一的问题实际上是使用glob,而不是readline。不确定我会称之为细微差别。
my @files = glob($pattern);