Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number

comment on

( #3333=superdoc: print w/replies, xml ) Need Help??
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:
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : 5 : opendir (DIR, $dir) or die $!; 6 : my @dir = readdir DIR; 7 : 8 : foreach my $item (@dir) { 9 : print "$item\n"; 10: } 11: 12: closedir DIR;
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.

LINES 8-10:
Print each directory element onto the screen, one per line.

LINE 12:
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).
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : 5 : opendir (DIR, $dir) or die $!; 6 : my @dir = readdir DIR; 7 : my @perlFiles = grep /\.pl/, readdir DIR; 8 : 9 : foreach my $item (@perlFiles) { 10: print "$item\n"; 11: } 12: 13: closedir DIR;
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:
1 : use Cwd; 2 : 3 : my $dir = getcwd; 4 : my $dirPointer; 5 : 6 : opendir (DIR, $dir) or die $!; 7 : $dirPointer = telldir (DIR); 8 : 9 : my @dir = readdir DIR; 10: 11: seekdir (DIR, $dirPointer); 12: 13: my @perlFiles = grep /\.pl/, readdir DIR; 14: 15: foreach my $item (@perlFiles) { 16: print "$item\n"; 17: } 18: 19: closedir DIR;
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).
1: use Cwd; 2: 3: print getcwd,"\n"; 4: chdir("C:\\"); 5: print getcwd;
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.

Good luck!

- Sherlock

In reply to Navigating and Reading Directories by Sherlock

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or or How to display code and escape characters are good places to start.
Log In?

What's my password?
Create A New User
Domain Nodelet?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (2)
As of 2022-01-23 03:30 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (63 votes). Check out past polls.