我正在尝试将目录中的每个文本文件读入变量,然后打印前100个字符,包括换行符。但是,Perl说这些文件即使确实存在也不存在。
use strict;
use warnings;
my $dir = "C:\\SomeFiles";
my @flist;
open(my $fh, "dir /a:-d /b $dir |") || die "$!";
while (<$fh>) {
if ($_ =~ /.*(.txt)$/i) {
push(@flist, $_);
}
}
foreach my $f (@flist) {
print "$dir\\$f";
my $txt = do {
local $/ = undef;
open(my $ff, "<", "$dir\\$f") || die "$!";
<$ff>;
};
print substr($txt, 0, 100);
}
运行脚本时,会将以下内容写入控制台:
C:\SomeFiles\file1.txt
No such file or directory at script.pl line 19, <$fh> chunk 10.
正在查看正确的文件,我确定该文件存在。当我尝试使用此方法打开单个文件而不是通过带有foreach
的数组获取每个文件时,它可以正常工作。有没有明显的东西我在这里忽略了?
答案 0 :(得分:4)
更好的解决方案是使用readdir()代替(或File::Find,如果你想要递归地执行它):
my $dir = "C:\\SomeFiles";
opendir(my $dh, $dir) || die "$!";
while (my $file = readdir($dh)) {
if ($file =~ /\\.txt$/i) {
print $file . "\n";
my $txt = do {
local $/ = undef;
open(my $ff, "<", "$dir\\$file") || die "$!";
<$ff>;
};
print substr($txt, 0, 100) . "\n";
}
}
closedir($dh);