Dirk80 has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks,

my input is a directory. This directory contains files and directories. I want to print out all files and directories. I do NOT want to visit subdirectories.

Here you can see my script:

#!/usr/bin/perl use strict; use warnings; opendir( DIR, "D:/test_dir"); my @file_list = readdir(DIR); closedir(DIR); print "Decision whether it is a file or a directory:\n"; foreach ( @file_list ) { if( (-d $_) ) { print "directory: " . $_ . "\n"; } if( (-f $_) ) { print "file: " . $_ . "\n"; } } print "\n\n"; print "Just print everything:\n"; foreach ( @file_list ) { print $_ . "\n"; }

And here the result of the script:

Decision whether it is a file or a directory: directory: . directory: .. Just print everything: . .. abc appl asdf Copy of ignore.txt GpSw.chk ignore.txt vxos

If I just print out everything it is working. But I want to know which of the items found in the root directory is a file and which one is a directory. Why isn't it working?

Thank you very much

Greetings

Dirk

Replies are listed 'Best First'.
Re: readdir and recognizing difference between files and directories
by tirwhan (Abbot) on Apr 07, 2010 at 15:07 UTC

    You're testing the files and directories as if they were in your current working directory, not the one you're examining. Here's a version that would work:

    #!/usr/bin/perl use strict; use warnings; my $dir = "D:/test_dir"; opendir( DIR, $dir); my @file_list = readdir(DIR); closedir(DIR); print "Decision whether it is a file or a directory:\n"; foreach ( @file_list ) { if( (-d "$dir/$_") ) { print "directory: " . $_ . "\n"; } if( (-f "$dir/$_") ) { print "file: " . $_ . "\n"; } } print "\n\n"; print "Just print everything:\n"; foreach ( @file_list ) { print $_ . "\n"; }

    All dogma is stupid.
Re: readdir and recognizing difference between files and directories
by moritz (Cardinal) on Apr 07, 2010 at 15:08 UTC
    -d $file tests if there is a directory called $file inside the current director. So you need to prepend the directory, or chdir to the directory you are reading.
    Perl 6 - links to (nearly) everything that is Perl 6.
Re: readdir and recognizing difference between files and directories
by repellent (Priest) on Apr 11, 2010 at 07:42 UTC
    use File::Find qw(find); my $i = -1; find sub { return unless $File::Find::prune = ++$i; print "directory: $File::Find::name\n" and return if -d $_; print "file: $File::Find::name\n" and return if -f $_; }, "D:/test_dir";
Re: readdir and recognizing difference between files and directories
by kennethk (Abbot) on Apr 07, 2010 at 15:12 UTC
    Your code as posted (and changing my working directory) works for me:

    Decision whether it is a file or a directory: directory: . directory: .. file: fluff.pl file: translate.pl Just print everything: . .. fluff.pl translate.pl
    Working directory issues, as listed above.