当我用opendir()
打开一个目录,然后连续调用readdir()
两次时,后者返回一个空数组。
minimal_example.pl:
#!/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);
my @FILES2 = readdir($DIRH);
print Dumper @FILES;
print Dumper @FILES2;
输出:
$VAR1 = [
'.',
'..',
'users',
'sysadmin',
'ne'
];
$VAR1 = [];
这是预期的行为吗?
Perl中的许多运算符的返回方式不同,这取决于它们是在列表上下文中调用还是在标量上下文中调用。readdir 就是这样
返回
opendir
打开的目录的下一个目录条目。如果在列表上下文中使用,则返回目录中的所有其余条目。如果没有更多条目,则在标量上下文中返回未定义的值,在列表上下文中返回空列表。
由于代码中readdir
的返回被分配给了一个数组,它位于列表上下文中,因此它读取该目录中的所有内容。因此,当目录句柄到达文件列表的末尾时;读取";返回一个空列表(即使同时添加了更多文件(。
我看不出两次读取文件列表会产生什么效果,但要多次处理一个目录,可以使用rewinddir。
是的,这是预期的行为。您对readdir()
的第一次调用读取了整个目录,并将其内容分配给了@FILES
。这没有给第二个readdir()
留下任何可读取的内容,因此它没有返回任何内容。