in reply to can I get a translation

When readdir returns a value, all it returns is the file name, as opposed to the full path. Therefore, when you pass that file name to open or to -X, it will look for a file by that name in the current working directory not in the directory that you opened (unless they happen to be the same). The code snippet does the following:
  1. Opens the directory named $some_dir and associates it with the directory handle DIR
  2. Gets a list of all filenames and passes that through a grep that:
    1. checks that the file name starts w/ a period (.)
    2. checks that the file name with the path appended on the front is a file
    and stores the results in an array
  3. Closes the directory handle
Therefore, this code snippet will return a list of all files (not folders) in the directory $some_dir whose names start with periods. On UNIX-like systems, such files are frequently used to store configuration information, e.g. .login, .cshrc

Replies are listed 'Best First'.
Re^2: can I get a translation
by grashoper (Monk) on Apr 23, 2009 at 15:15 UTC
    Thanks I was looking to strip off the . and .. from the list returned as what I am wanting to do is travel down a directory tree opening files and checking to make sure they are valid, this is for a project I am working on to store results of tests into a database. I am on windows system so my filenames don't start with a period, I managed to get my list of directories now I would like to open the files within those directories but I don't think this is quite right.
    opendir(DIR, "c:\\mlx\\") || die "can't opendir: $!"; @list = grep { $_ ne '.' && $_ ne '..'&& $_ ne 'copy.pl' } @list=readdir(DIR); foreach $name (@list) { print $name, "\n"; opendir(DIR, $name); @files=readdir(DIR); foreach $file(@files){ print "filename is ", $file, "\n"; } #opendir(DIR, "$_")||die "Not able to open directory $!"; @files=readdir(DIR); foreach(@files) { print $_, "\n"; } }
    this runs but I its not giving me all the files. I have files in each directory it looks to be returning for only one of them.
      You can easily modify your regex to match only entries that do not start a period (\^[^\.]\) to remove the current and parent directories from the list, but that is redundant with performing the file test -f, which returns false on folders. Do you want to collect folders as well as files as you traverse your tree, or are you only interested in checking file names in known directories? Removing the regular expression from you posted code will achieve the latter.