Perl 如何在文件夹中只列出两个特定格式的文件并将其打印到文本文件中

Perl 如何在文件夹中只列出两个特定格式的文件并将其打印到文本文件中,perl,Perl,下面的代码只能读取txt文件,并将filename和size打印到filename.txt中 my $directory = 'c:\modules\SFTP'; my $file='filename.txt'; my $OUTFILE; open $OUTFILE, '>>', $file; my @files = do { opendir my $dh, $directory; grep {/^.*\.txt\z/si} readdir($dh); }; fo

下面的代码只能读取
txt
文件,并将
filename
size
打印到
filename.txt

my $directory = 'c:\modules\SFTP';
my $file='filename.txt';
my $OUTFILE;

open $OUTFILE, '>>', $file;

my @files = do {
    opendir my $dh, $directory;
    grep {/^.*\.txt\z/si} readdir($dh);
};
foreach(@files){
 my $filesize = stat($_)->size;

  print { $OUTFILE } "$filesize $_" ,"\n";

}
我的问题是,究竟有没有两种特定的文件格式,而不是只有一种

例如文件夹A

textfile1.txt
textfile2.txt
testfile3.fcd
预期结果:

能够获取并打印两种特定格式的
(.txt和.fcd)
文件的
文件名
大小
,而不仅仅是一个
(.txt)


为了得到预期的结果,我应该在代码中更改或添加什么?有没有相关的帖子或有用的资源可以分享?谢谢

你大部分都做对了。确保您在
opendir
周围有paren<代码>使用警告应该指出这一点。只需将另一个模式添加到您的
grep
。此外,在读取目录后打开输出文件,否则将在输出中列出输出文件

use strict;
use warnings; 
use autodie;
use File::stat;

my $directory = 'c:\modules\SFTP';
my $file = 'filename.txt';

opendir (my $dh, $directory);
my @files = grep(/^.*\.(txt|fcd)\z/si, readdir $dh);

open my $OUTFILE, '>', $file;

foreach(@files){
    my $filesize = stat($_)->size;
    print $OUTFILE "$filesize $_" ,"\n";
}

如前所述,根据多个扩展进行筛选所需的全部工作是在正则表达式中设置更改:

/\.(?:txt|fcd)$/i
请注意,我也简化了您的正则表达式,因为它不需要匹配文件名的开头

通过使用Path::Class进行增强 我建议您研究更简单的文件和路径操作

以下操作与脚本的操作相同,但可确保文件测试中不会丢失路径信息:

use strict;
use warnings;
use autodie;

use Path::Class;

my $dir = dir('c:\modules\SFTP');

open my $outfh, '>>', 'filename.txt';

while (my $file = $dir->next) {
    next unless $file =~ /\.(?:txt|fcd)$/;
    printf $outfh "%s %s\n", $file->stat->size, $file->basename;
}

grep{/^.*\(txt | fcd)\z/si}
应该可以解决这个问题。@jaypal-Hi,你能把答案贴出来让我接受吗=DD.谢谢您的帮助。opendir参数周围的参数是不必要的。@JimDavis是对的,但是因为有两个变量(文件句柄和目录)并且声明了
my$dh
,所以需要添加它<代码>使用警告将显示该警告。或者,如果您在
opendir
之前声明
$dh
,那么是的,您不需要它;它功能完美,在Windows(草莓5.20)或Ubuntu(5.10和5.18)上都没有警告:
perl-Mstrict-wE'my$foo=“…”;opendir我的$df,$foo或die“$!”;对于readdir$df'
@JimDavis,请移除
或死“$!”
,然后重试<代码>:)奇数;根据Deparse-p,它可以归结为
opendir(my$df,$foo)
有无
或die
。(阅读更多关于它的内容)它可以工作,它只是生成警告,因为它可能是不明确的,但是
或die
使它神奇地不含糊。因此,它实际上只需要防止警告。