|Perl Monk, Perl Meditation|
This is a fairly straightforward tutorial of how to open a directory, read the contents from that directory, and change directories.
There are 7 basic functions that can be utilized to navigate through directories: opendir, readdir, closedir, rewinddir, telldir, seekdir, chdir. I'll give you an example of how to use each of these to help get you started.
opendir, readdir, & closedir
Let's start with the following code:
This bit of code simply opens the current working directory (CWD) and then displays the contents of it on the screen (much like the 'dir' command in DOS or 'ls' on UNIX). Let's look at the code a piece at a time.
This line simply gives us access to the getcwd command that will retrieve the current working directory.
This line stores the CWD into the scalar $dir.
Open the directory using opendir. The function opendir will return true if it was successful, otherwise, it will return false. If the directory can't be opened (i.e. the directory doesn't exist), the opendir function will return false and the script will terminate.
Use the readdir function to store the contents of the file into @dir.
Print each directory element onto the screen, one per line.
Finally, close the file using the closedir function.
Now that we've seen how to use opendir, readdir, and closedir, we can look at a couple of the other functions for dealing with directories. First, let's look at rewinddir.
This bit of code will fill two arrays, @dir and @perlFiles. The array @dir will be filled with all of the contents of the directory and we'll use grep to filter the contents of the directory and put only Perl files (.pl files) into the array @perlFiles. Finally, we'll print just Perl files (as if we typed "dir *.pl" in DOS).
From this bit of code, you won't get any output. The reason is that when using the readdir function, the seekpointer (the file/directory currently being pointed to) has moved all the way to the end of the directory. If it hadn't, we wouldn't have all of the contents of our directory in @dir. Unfortnately, this leaves @perlFiles empty. To fix this, we need to reset the seekpointer to the beginning of the directory by using rewinddir. Add this line between lines 6 and 7:
Now, you should get the output of just the Perl files within your directory.
telldir & seekdir
You can also set the seekpointer to any position within the directory (rather than just the beginning) by using telldir and seekdir. The telldir function returns the current seekpointer and the seekdir function will set the seekpointer to a value returned by the telldir function. If this sounds confusing, try this script:
In this script, I'm storing the original seekpointer (that being at the beginning of the directory), using telldir, and then later using seekdir to move the seekpointer to that point. In this case, we've recreated rewinddir. If you execute this script, you should get the exact same output that we got for the previous one.
The final function for dealing with directories is chdir. This one is pretty simple, pass it an expression and chdir will change the current working directory to that (if possible).
This little script will display the CWD and then try to change that CWD to "C:\". You might want to do a check in case it can't find that directory, but this was just a quick example.
With that, you should be able to navigate through directories pretty easily. For more information, you can take a look at The Perl Documentation.