私のファイルシステムを通過するときにPerlスクリプトがいくつかのサブディレクトリを認識するのに問題があります。Perlスクリプトが-dフラグを使ってすべてのディレクトリを認識しない
これは宿題の一部であり、どのような種類のモジュールも使用できないことにご注意ください。私はかなり時間をかけてこれを私自身でトラブルシューティングしようとしましたが、今はちょっとした障害になっています。
私は、ファイル構造を横断し、それぞれの配列にファイル、ディレクトリ、およびサブディレクトリのすべての名前をキャプチャし、下図の形式でそれらをプリントアウトしようとしています:
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
がディレクトリとして認識されるべきです。
'-r'をチェックしています - そうでない場合はファイルですか?それは不思議な論理です - ディレクトリかファイルかをチェックする必要があります - 読めるかどうかは別の問題です。 – bytepusher
コードをより慎重にレイアウトする必要があります。字下げはすべての場所にあります。また、 '' $ entry ''から引用符を削除する必要がありますが、場合によっては問題を引き起こす可能性があります。 – Borodin
ありがとう@ボロディン、あなたは絶対に正しいです。あなたの提案ごとにスクリプトを修正しました。 –