73 lines
1.3 KiB
Perl
73 lines
1.3 KiB
Perl
|
package DirHandle;
|
||
|
|
||
|
=head1 NAME
|
||
|
|
||
|
DirHandle - supply object methods for directory handles
|
||
|
|
||
|
=head1 SYNOPSIS
|
||
|
|
||
|
use DirHandle;
|
||
|
$d = new DirHandle ".";
|
||
|
if (defined $d) {
|
||
|
while (defined($_ = $d->read)) { something($_); }
|
||
|
$d->rewind;
|
||
|
while (defined($_ = $d->read)) { something_else($_); }
|
||
|
undef $d;
|
||
|
}
|
||
|
|
||
|
=head1 DESCRIPTION
|
||
|
|
||
|
The C<DirHandle> method provide an alternative interface to the
|
||
|
opendir(), closedir(), readdir(), and rewinddir() functions.
|
||
|
|
||
|
The only objective benefit to using C<DirHandle> is that it avoids
|
||
|
namespace pollution by creating globs to hold directory handles.
|
||
|
|
||
|
=cut
|
||
|
|
||
|
require 5.000;
|
||
|
use Carp;
|
||
|
use Symbol;
|
||
|
|
||
|
sub new {
|
||
|
@_ >= 1 && @_ <= 2 or croak 'usage: new DirHandle [DIRNAME]';
|
||
|
my $class = shift;
|
||
|
my $dh = gensym;
|
||
|
if (@_) {
|
||
|
DirHandle::open($dh, $_[0])
|
||
|
or return undef;
|
||
|
}
|
||
|
bless $dh, $class;
|
||
|
}
|
||
|
|
||
|
sub DESTROY {
|
||
|
my ($dh) = @_;
|
||
|
closedir($dh);
|
||
|
}
|
||
|
|
||
|
sub open {
|
||
|
@_ == 2 or croak 'usage: $dh->open(DIRNAME)';
|
||
|
my ($dh, $dirname) = @_;
|
||
|
opendir($dh, $dirname);
|
||
|
}
|
||
|
|
||
|
sub close {
|
||
|
@_ == 1 or croak 'usage: $dh->close()';
|
||
|
my ($dh) = @_;
|
||
|
closedir($dh);
|
||
|
}
|
||
|
|
||
|
sub read {
|
||
|
@_ == 1 or croak 'usage: $dh->read()';
|
||
|
my ($dh) = @_;
|
||
|
readdir($dh);
|
||
|
}
|
||
|
|
||
|
sub rewind {
|
||
|
@_ == 1 or croak 'usage: $dh->rewind()';
|
||
|
my ($dh) = @_;
|
||
|
rewinddir($dh);
|
||
|
}
|
||
|
|
||
|
1;
|