我有一个程序,它将目录名作为用户的输入,并搜索目录中的所有文件并打印文件的内容。有没有什么方法可以读取文件的扩展名并读取指定扩展名的文件内容?例如,它应该读取“.txt”格式的文件内容。
我的代码是
use strict;
use warnings;
use File::Basename;
#usr/bin/perl
print "enter a directory name\n";
my $dir = <>;
print "you have entered $dir \n";
chomp($dir);
opendir DIR, $dir or die "cannot open directory $!";
while ( my $file = readdir(DIR) ) {
next if ( $file =~ m/^\./ );
my $filepath = "${dir}${file}";
print "$filepath\n";
print " $file \n";
open( my $fh, '<', $filepath ) or die "unable to open the $file $!";
while ( my $row = <$fh> ) {
chomp $row;
print "$row\n";
}
}
答案 0 :(得分:1)
要获取“.txt”文件,可以使用文件测试运算符(-f:常规文件)和正则表达式。
my @files = grep { -f && /\.txt$/ } readdir $dir;
否则,您可以使用perl的-T(ascii-text file test operator)查找文本文件
my @files = grep { -T } readdir $dir;
否则你甚至可以试试这个:
my @files = grep {-f} glob("$dir/*.txt");
答案 1 :(得分:0)
你离这儿很近。你有一个主循环,如下所示:
while ( my $file = readdir(DIR) ) {
next if $file =~ /^\./; # skip hidden files
# do stuff
}
如果文件名以点开头,请查看跳过循环迭代的位置。这是放置任何其他跳过要求的绝佳场所 - 例如跳过不会以&#39; .txt&#39;结尾的文件。
while ( my $file = readdir(DIR) ) {
next if $file =~ /^\./; # skip hidden files
next unless $file =~ /\.txt$/i; # skip non-text files
# do stuff
}
与原始测试检查字符串开头(^
)后跟文字点(\.
)的方式相同,我们现在正在搜索点({ {1}})后跟\.
和字符串结尾(txt
)。请注意,我还在匹配运算符中添加了$
选项,以使匹配不区分大小写 - 以便我们匹配&#34; .TXT&#34;以及&#34; .txt&#34;。
值得注意的是,扩展文件是计算文件所包含内容的一种可怕方法。
答案 2 :(得分:-1)
试试这个。下面的代码给出了您的期望。
use warnings;
use strict;
print "Enter the directory name: ";
chomp(my $dir=<>);
print "Enter the file extension type: "; #only type the file format. like txt rtf
chomp(my $ext=<>);
opendir('dir',"$dir");
my @files = grep{m/.$ext/g} readdir('dir');
foreach my $ech(@files){
open('file',"$dir/$ech");
print <file>;
}
我存储特定目录中的所有文件以存储一个数组,并使用grep命令获取特定的文件格式。然后将文件打开到foreach
条件