2017-09-03 5 views
0

私のファイルシステムを通過するときに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 

stilltestingmoretestingがディレクトリとして認識されるべきです。

+1

'-r'をチェックしています - そうでない場合はファイルですか?それは不思議な論理です - ディレクトリかファイルかをチェックする必要があります - 読めるかどうかは別の問題です。 – bytepusher

+0

コードをより慎重にレイアウトする必要があります。字下げはすべての場所にあります。また、 '' $ entry ''から引用符を削除する必要がありますが、場合によっては問題を引き起こす可能性があります。 – Borodin

+1

ありがとう@ボロディン、あなたは絶対に正しいです。あなたの提案ごとにスクリプトを修正しました。 –

答えて

0
if (-d $entry) 

if (-d "$currdir/$entry") 

$entryする必要がありますは、ディレクトリ内の名前だけです。 -dには実際のパスが必要です。

+0

意味 '-d -r $ entry'は' -d $ entry'が '-d" $ currdir/$ entry "'でなければなりません。私は別の '-r $ entry'(警告または例外として)を作成した後、これを見ることを望んでいました。正直言って、私は宿題の方針について完全には確信していませんでした。 – bytepusher

+0

@melpomeneありがとう、これは私が行方不明だった正確にあった。スクリプトは意図したとおりに動作するようになりました。 –

+0

@bytepusher、 '-d -r" $ currdir/$ entry "'は完璧です。 5.10より、 '-d" $ currdir/$ entry "&& -r" $ currdir/$ entry "' – ikegami

関連する問題