Although the answer to your question is "use -l", I wonder if instead of just filtering out the symbolic links, you actually want to filter out everything which is not a plain file (e.g. directories, device nodes, named pipes, sockets, etc).
In that case, the test you want is '-f'. See "perldoc -f -f" for more details.
Also, I like to think that the list-processing commands of perl (map, grep) make for very readable (and shorter) code in this sort of situation.
Some other notes:
- You don't need to put the scalar $directoryName in quotes. All that does is expand to a string containing $directoryName, you can just pass it in directly.
- Using file and directory handles like DIR is slightly poor style. The problem is that these are global names shared with the rest of your code. If you had one dir open with DIR and you called another function which opened another dir in the same way, the two handles would conflict. The better way (as with files and 'open') is to use a lexical scalar variable, as below, for the dirhandle.
- Whenever you do something like opening a dir, it's good to test for failure (a false return from opendir) and if so, to give an error containing the system error code, $!
my $directoryName = '/tmp';
opendir(my $dh, $directoryName)
or die "Can't open dir $directoryName : $!";
my @files = grep { -f "$directoryName/$_" } readdir($dh);
closedir($dh);
print "$_\n" for @files;
The last line (using a one-line for-loop with
$_) is a little terse, and I don't often write it that way, but it's a useful trick to know.
Hope you don't mind the extended comment on your post, I thought I'd take the chance to get a few things off my chest :-)