Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中,是否有一种简洁的方式来组合glob和printf?_Perl_Printf_Glob - Fatal编程技术网

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

在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

我希望@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";
}
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);