| Line | |
|---|
| 1 | package DirHandle;
|
|---|
| 2 |
|
|---|
| 3 | our $VERSION = '1.00';
|
|---|
| 4 |
|
|---|
| 5 | =head1 NAME
|
|---|
| 6 |
|
|---|
| 7 | DirHandle - supply object methods for directory handles
|
|---|
| 8 |
|
|---|
| 9 | =head1 SYNOPSIS
|
|---|
| 10 |
|
|---|
| 11 | use DirHandle;
|
|---|
| 12 | $d = new DirHandle ".";
|
|---|
| 13 | if (defined $d) {
|
|---|
| 14 | while (defined($_ = $d->read)) { something($_); }
|
|---|
| 15 | $d->rewind;
|
|---|
| 16 | while (defined($_ = $d->read)) { something_else($_); }
|
|---|
| 17 | undef $d;
|
|---|
| 18 | }
|
|---|
| 19 |
|
|---|
| 20 | =head1 DESCRIPTION
|
|---|
| 21 |
|
|---|
| 22 | The C<DirHandle> method provide an alternative interface to the
|
|---|
| 23 | opendir(), closedir(), readdir(), and rewinddir() functions.
|
|---|
| 24 |
|
|---|
| 25 | The only objective benefit to using C<DirHandle> is that it avoids
|
|---|
| 26 | namespace pollution by creating globs to hold directory handles.
|
|---|
| 27 |
|
|---|
| 28 | =head1 NOTES
|
|---|
| 29 |
|
|---|
| 30 | =over 4
|
|---|
| 31 |
|
|---|
| 32 | =item *
|
|---|
| 33 |
|
|---|
| 34 | On Mac OS (Classic), the path separator is ':', not '/', and the
|
|---|
| 35 | current directory is denoted as ':', not '.'. You should be careful
|
|---|
| 36 | about specifying relative pathnames. While a full path always begins
|
|---|
| 37 | with a volume name, a relative pathname should always begin with a
|
|---|
| 38 | ':'. If specifying a volume name only, a trailing ':' is required.
|
|---|
| 39 |
|
|---|
| 40 | =back
|
|---|
| 41 |
|
|---|
| 42 | =cut
|
|---|
| 43 |
|
|---|
| 44 | require 5.000;
|
|---|
| 45 | use Carp;
|
|---|
| 46 | use Symbol;
|
|---|
| 47 |
|
|---|
| 48 | sub new {
|
|---|
| 49 | @_ >= 1 && @_ <= 2 or croak 'usage: new DirHandle [DIRNAME]';
|
|---|
| 50 | my $class = shift;
|
|---|
| 51 | my $dh = gensym;
|
|---|
| 52 | if (@_) {
|
|---|
| 53 | DirHandle::open($dh, $_[0])
|
|---|
| 54 | or return undef;
|
|---|
| 55 | }
|
|---|
| 56 | bless $dh, $class;
|
|---|
| 57 | }
|
|---|
| 58 |
|
|---|
| 59 | sub DESTROY {
|
|---|
| 60 | my ($dh) = @_;
|
|---|
| 61 | closedir($dh);
|
|---|
| 62 | }
|
|---|
| 63 |
|
|---|
| 64 | sub open {
|
|---|
| 65 | @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
|
|---|
| 66 | my ($dh, $dirname) = @_;
|
|---|
| 67 | opendir($dh, $dirname);
|
|---|
| 68 | }
|
|---|
| 69 |
|
|---|
| 70 | sub close {
|
|---|
| 71 | @_ == 1 or croak 'usage: $dh->close()';
|
|---|
| 72 | my ($dh) = @_;
|
|---|
| 73 | closedir($dh);
|
|---|
| 74 | }
|
|---|
| 75 |
|
|---|
| 76 | sub read {
|
|---|
| 77 | @_ == 1 or croak 'usage: $dh->read()';
|
|---|
| 78 | my ($dh) = @_;
|
|---|
| 79 | readdir($dh);
|
|---|
| 80 | }
|
|---|
| 81 |
|
|---|
| 82 | sub rewind {
|
|---|
| 83 | @_ == 1 or croak 'usage: $dh->rewind()';
|
|---|
| 84 | my ($dh) = @_;
|
|---|
| 85 | rewinddir($dh);
|
|---|
| 86 | }
|
|---|
| 87 |
|
|---|
| 88 | 1;
|
|---|
Note:
See
TracBrowser
for help on using the repository browser.