为何连续两次调用readdir()时第二次返回空数组?
这是预期行为吗?
是的,这完全是Perl中readdir()函数的预期行为。
原因说明
opendir()返回的目录句柄本质是一个迭代器:它从目录的起始位置开始遍历条目,每执行一次readdir(),指针就会向后移动。当你用my @FILES = readdir($DIRH);这种方式调用时,会一次性读取目录内的所有条目,此时目录句柄的指针已经移动到了目录的末尾。
后续再调用readdir($DIRH)时,因为没有剩余条目可以读取,自然返回空数组。
常见解决方式
如果需要再次获取目录条目,可采用以下几种方法:
- 复用已读取的结果:直接使用第一次读取得到的
@FILES数组即可,无需重复调用readdir()。 - 重置目录句柄指针:使用
rewinddir($DIRH)将指针重置到目录起始位置,之后就能重新读取条目:
#!/usr/bin/perl use strict; use warnings; use Data::Dumper qw(Dumper); opendir(my $DIRH, "/home") or die "Cannot open /home: $!\n"; my @FILES = readdir($DIRH); rewinddir($DIRH); # 重置目录指针 my @FILES2 = readdir($DIRH); print Dumper \@FILES; print Dumper \@FILES2;
- 重新打开目录:关闭当前目录句柄后再次调用
opendir(),也能重新读取目录内容:
#!/usr/bin/perl use strict; use warnings; use Data::Dumper qw(Dumper); opendir(my $DIRH, "/home") or die "Cannot open /home: $!\n"; my @FILES = readdir($DIRH); closedir($DIRH); opendir($DIRH, "/home") or die "Cannot open /home: $!\n"; my @FILES2 = readdir($DIRH); closedir($DIRH); print Dumper \@FILES; print Dumper \@FILES2;
内容的提问来源于stack exchange,提问作者noah
相关产品推荐
相关产品推荐

