在perl中读取目录中的所有文件

9
在我的代码的第一部分中,我读取一个文件并将其不同部分存储在目录中的不同文件中。接下来,我想要读取我在代码的第一部分中构建的该目录中的所有文件。
while(<file>){

#making files in directory Dir

}

opendir(Dir, $indirname) or die "cannot open directory $indirname";
@docs = grep(/\.txt$/,readdir(Dir));
foreach $d (@Dir) {
    $rdir="$indirname/$d";
    open (res,$rdir) or die "could not open $rdir";
    while(<res>){


}

但是使用这段代码,最后一个文件的最后一行将不会被读取。

2
你为什么认为最后一个文件的最后一行不会被读取? - ysth
不要使用裸字文件句柄,应该像 open (my $res,'<',$rdir) or die "could not open $rdir $!"; 这样写。 - Nikhil Jain
我认为你的foreach语句应该是foreach $d (@docs) { - jimtut
3个回答

16

由于我不知道你在行读取循环中做了什么,也不理解@docs和@Dir,所以我会展示对我来说“有效”的代码:

use strict;
use warnings;
use English;

my $dir = './_tmp/readFID';
foreach my $fp (glob("$dir/*.txt")) {
  printf "%s\n", $fp;
  open my $fh, "<", $fp or die "can't read open '$fp': $OS_ERROR";
  while (<$fh>) {
    printf "  %s", $_;
  }
  close $fh or die "can't read close '$fp': $OS_ERROR";
}

输出:

./_tmp/readFID/123.txt
  1
  2
  3
./_tmp/readFID/45.txt
  4
  5
./_tmp/readFID/678.txt
  6
  7
  8

也许您可以发现与您的脚本相关的差异。

5

我稍微修改了代码,只是为了测试一下基本的想法,在一个包含我的perl程序的目录中,它似乎能够工作。你应该遍历@docs而不是@dir(我强烈建议同时使用strict和warnings编译指令)。

opendir(DIR, ".") or die "cannot open directory";
@docs = grep(/\.pl$/,readdir(DIR));
foreach $file (@docs) {
    open (RES, $file) or die "could not open $file\n";
    while(<RES>){
        print "$_";
    }
}

使用文件路径代替 .,它不会读取文件并显示错误消息“无法打开$file”。它仅适用于当前目录。 - serenesat

1

glob可以实现你想要的功能,而不需要打开 / 关闭文件。一旦你将一组文件放入 @ARGV 中,"diamond"运算符就可以像平常一样工作。

@ARGV = <$indirname/*.txt>;
while ( <> ) { 
    ... 
}

小心使用-i开关;它可能会使那个看似方便的功能变得有害。 - ysth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接