A translation of sorts:
- If used in list context.... What this is saying is that readdir() can be used either to return one directory member at a time or all directory members at once. If you do @files=readdir(DIR) you get them all at once because Perl sees the "@" before "@files" and thinks list context. If you do $sFile=readder(DIR) you get them one at a time because Perl sees scalar context. readdir keeps track of which ones you've already retrieved so far
- you'd better prepend the directory.... readdir returns the local name of a file rather than the fully qualified path, e.g. "foo.txt" rather than "/home/joe/foo.txt".
- Otherwise, because we didn't chdir there... Making your code dependent on the current directory isn't normally a good idea. But if $some_dir just happened to be the current directory, then using the local name instead of the fully qualified path would just happen to work.
As for the code
# opens a "cursor" on the directory entries
# works kind of like open(...) but for directories rather
# than files
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
# calls readdir(DIR) in list context - so that means that
# all directory entries are returned at once.
# then it passes the array of local file names through grep
# grep selects members of an array based on the return
# value of the {...} bit.
#
# $_ - a member of the array returned by readdir(DIR)
# i.e. the local name of a file in the directory $some_dir
#
# /^\./ - selects only local file names beginning with dots.
# this is short for $_ =~ /^\./
#
# -f "$some_dir/$_" - checks to see if the fully qualified path
# "$some_dir/$_" is an existing file.
@dots = grep { /^\./ && -f "$some_dir/$_" } readdir(DIR);
# like close() but for directories
closedir DIR;
Hope that helps, best, beth
Update: added explanation of grep {...} block