This is a really basic issue, but I’m new to perl and cannot work out what the issue is. I’m just trying to isolate the files in a directory, but the -d operator keeps treating all the folder contents as files …
@contents is my array, and when I run this:
use strict;
if ($ARGV[1]) {
die("Error: You can only monitor one directory at a time\n");
}
my $directory = $ARGV[0] || die "Error: No directory defined\n";
opendir(DIR, $directory) || die "Error: Can't open dir $directory: $!";
my @contents = readdir(DIR);
foreach my $item(@contents) {
if (-d $item) { next; }
print"$item is a file\n";
}
closedir (DIR);
I keep getting both folders and files. Alternatively, if I use -f, I get nothing.
edit: this is the output –
file01.txt is a file
folder 01 is a file
folder 02 is a file
Screen shot 2010-04-18 at 1.26.17 PM.png is a file
I’m running this on OSX
edit:dir ls -l output:
aaron ~/Documents/test: ls -l
total 112
-rw-r--r--@ 1 aaron staff 51235 18 Apr 13:26 Screen shot 2010-04-18 at 1.26.17 PM.png
-rw-r--r--@ 1 aaron staff 7 18 Apr 13:26 file01.txt
drwxr-xr-x 3 aaron staff 102 18 Apr 13:25 folder 01
drwxr-xr-x 2 aaron staff 68 18 Apr 13:25 folder 02
Solution
I was testing with ‘.’ as the directory…you’re testing with some other directory. The names read from the directory are then checked relative to the current directory. If I use some other directory name, I’ll get almost everything except ‘.’ and ‘..’ listed as files, regardless.
If you prefix the name with the value of $ARGV[0], you’ll get the expected result:
Previous attempts to explain
This works on MacOS X:
Test:
Given a marginally modified version of the code in the question:
Running it on the same directory as before, I get the output:
Note the Perlish idiom ‘
next if -d $item;‘. Also note the debugging techniques: print the names as they go through the array – using the ‘<<‘ and ‘>>’ to surround the name helps identify odd side effects (such as newlines in names). I did double check that the provided code produces the same result – it does. And I’m running on a MacOS X 10.6.3 with the stock Perl.