I am having issues getting my Perl script to recognize some subdirectories when traversing through my file system.
Please note that this is part of a homework assignment, and I am unable to use modules of any kind. I have attempted to troubleshoot this on my own for quite some time, and am now at a bit of a roadblock.
I am attempting to traverse a file structure, capture the names of all of the files, directories, and subdirectories into their respective arrays, and print them out in the illustrated format below:
Directory: ./  
Files: file1.text file2.pl file3.text  
Directories: subdir1 subdir2 subdir3  
Directory: subdir1  
Files: file3.text file4.pl  
Directories: subdir42  
...and so on.
I have attempted to use recursion as a solution to this, but my teacher indicated that recursion was not the appropriate way to handle this problem.
I have managed to print, in the appropriate format, the current working directory, and subdirectories within the current working directory.
For some reason, when I change the current code block to
if (-d $entry){
        next if $entry =~/^\./;
       push(@subdirs,"$entry");
       push(@dirs,"$currdir/$entry");
        }
      elsif(-f $entry) {
        push(@files,"$entry");
      }
It will omit some of the subdirectories.
Please see the entire script below.
#!/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();
And the current output:
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 and moretesting should be recognized as directories.
                        
should be
$entryis just a name in a directory.-dneeds an actual path.