Perl 脚本无法识别所有使用 -d 标志的目录
Perl script is not recognizing all directories using -d flag
我在遍历我的文件系统时无法让我的 Perl 脚本识别某些子目录。
请注意,这是家庭作业的一部分,我无法使用任何类型的模块。很长一段时间以来,我一直试图自己解决这个问题,但现在遇到了一些障碍。
我正在尝试遍历一个文件结构,将所有文件、目录和子目录的名称捕获到它们各自的数组中,并以下面所示的格式打印出来:
Directory: ./
Files: file1.text file2.pl file3.text
Directories: subdir1 subdir2 subdir3
Directory: subdir1
Files: file3.text file4.pl
Directories: subdir42
...等等。
我曾尝试使用递归来解决这个问题,但我的老师指出递归不是处理这个问题的合适方法。
我已经设法以适当的格式打印当前工作目录和当前工作目录中的子目录。
出于某种原因,当我将当前代码块更改为
if (-d $entry){
next if $entry =~/^\./;
push(@subdirs,"$entry");
push(@dirs,"$currdir/$entry");
}
elsif(-f $entry) {
push(@files,"$entry");
}
它会省略一些子目录。
请查看下面的完整脚本。
#!/usr/bin/perl
use strict;
use warnings;
sub traverse {
my @dirs = ('.');
my @subdirs;
my @files;
while(my $currdir = shift @dirs){
opendir(my $dirhandle, $currdir) or die $!;
while( my $entry = readdir $dirhandle){
if (-d -r $entry){
next if $entry =~/^\./;
push(@subdirs,"$entry");
push(@dirs,"$entry");
}
else {
push(@files,"$entry");
}
}
print "Directory: $currdir\n";
print "Directories: ";
print "@subdirs";
print"\n";
print "Files: ";
foreach my $curfile (@files) {
next if $curfile eq '.' or $curfile eq '..';
if ($curfile =~ /(\S*\.delete)/){
unlink "$currdir/$curfile";
}
$curfile =~ s/txt$/text/;
print "$curfile ";
}
print "\n";
close $dirhandle;
undef @files;
undef @subdirs;
}
return;
}
traverse();
而当前输出:
Directory: .
Directories: test dir_3 test2
Files: recursion.text count_files.pl testing.text thelastone.pl testing.pl prog5_test.pl program51.pl program5.pl recursion.pl recurse.text prog52.pl
dirs.pl
Directory: test
Directories:
Files: testfile1.text prog5_test.pl stilltesting program5.pl testfile2.text dirs.pl
Directory: dir_3
Directories:
Files:
Directory: test2
Directories:
Files: file2.text moretesting file3.text
stilltesting
和 moretesting
应该被识别为目录。
if (-d $entry)
应该是
if (-d "$currdir/$entry")
$entry
只是目录中的一个名称。 -d
需要实际路径。
我在遍历我的文件系统时无法让我的 Perl 脚本识别某些子目录。
请注意,这是家庭作业的一部分,我无法使用任何类型的模块。很长一段时间以来,我一直试图自己解决这个问题,但现在遇到了一些障碍。
我正在尝试遍历一个文件结构,将所有文件、目录和子目录的名称捕获到它们各自的数组中,并以下面所示的格式打印出来:
Directory: ./
Files: file1.text file2.pl file3.text
Directories: subdir1 subdir2 subdir3
Directory: subdir1
Files: file3.text file4.pl
Directories: subdir42
...等等。
我曾尝试使用递归来解决这个问题,但我的老师指出递归不是处理这个问题的合适方法。
我已经设法以适当的格式打印当前工作目录和当前工作目录中的子目录。
出于某种原因,当我将当前代码块更改为
if (-d $entry){
next if $entry =~/^\./;
push(@subdirs,"$entry");
push(@dirs,"$currdir/$entry");
}
elsif(-f $entry) {
push(@files,"$entry");
}
它会省略一些子目录。
请查看下面的完整脚本。
#!/usr/bin/perl
use strict;
use warnings;
sub traverse {
my @dirs = ('.');
my @subdirs;
my @files;
while(my $currdir = shift @dirs){
opendir(my $dirhandle, $currdir) or die $!;
while( my $entry = readdir $dirhandle){
if (-d -r $entry){
next if $entry =~/^\./;
push(@subdirs,"$entry");
push(@dirs,"$entry");
}
else {
push(@files,"$entry");
}
}
print "Directory: $currdir\n";
print "Directories: ";
print "@subdirs";
print"\n";
print "Files: ";
foreach my $curfile (@files) {
next if $curfile eq '.' or $curfile eq '..';
if ($curfile =~ /(\S*\.delete)/){
unlink "$currdir/$curfile";
}
$curfile =~ s/txt$/text/;
print "$curfile ";
}
print "\n";
close $dirhandle;
undef @files;
undef @subdirs;
}
return;
}
traverse();
而当前输出:
Directory: .
Directories: test dir_3 test2
Files: recursion.text count_files.pl testing.text thelastone.pl testing.pl prog5_test.pl program51.pl program5.pl recursion.pl recurse.text prog52.pl
dirs.pl
Directory: test
Directories:
Files: testfile1.text prog5_test.pl stilltesting program5.pl testfile2.text dirs.pl
Directory: dir_3
Directories:
Files:
Directory: test2
Directories:
Files: file2.text moretesting file3.text
stilltesting
和 moretesting
应该被识别为目录。
if (-d $entry)
应该是
if (-d "$currdir/$entry")
$entry
只是目录中的一个名称。 -d
需要实际路径。