我今天写了一些使用readdir
. 也许你可以从中学到一些东西。这只是(有点)更大程序的一部分:
our @Perls = ();
{
my $perl_rx = qr { ^ perl [\d.] + $ }x;
for my $dir (split(/:/, $ENV{PATH})) {
### scanning: $dir
my $relative = ($dir =~ m{^/});
my $dirpath = $relative ? $dir : "$cwd/$dir";
unless (chdir($dirpath)) {
warn "can't cd to $dirpath: $!\n";
next;
}
opendir(my $dot, ".") || next;
while ($_ = readdir($dot)) {
next unless /$perl_rx/o;
### considering: $_
next unless -f;
next unless -x _;
### saving: $_
push @Perls, "$dir/$_";
}
}
}
{
my $two_dots = qr{ [.] .* [.] }x;
if (grep /$two_dots/, @Perls) {
@Perls = grep /$two_dots/, @Perls;
}
}
{
my (%seen, $dev, $ino);
@Perls = grep {
($dev, $ino) = stat $_;
! $seen{$dev, $ino}++;
} @Perls;
}
关键是push(@Perls, "$dir/$_")
:读取的文件readdir
名只是基本名;它们不是完整的路径名。