This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Refactoring the /Can't return (?:array|hash) to scalar context/ croak
[perl5.git] / lib / DirHandle.pm
CommitLineData
c07a80fd 1package DirHandle;
2
28ee7c39 3our $VERSION = '1.01';
b75c8c73 4
c07a80fd 5=head1 NAME
6
7DirHandle - 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
22The C<DirHandle> method provide an alternative interface to the
23opendir(), closedir(), readdir(), and rewinddir() functions.
24
25The only objective benefit to using C<DirHandle> is that it avoids
26namespace pollution by creating globs to hold directory handles.
27
95e8664e
CN
28=head1 NOTES
29
30=over 4
31
32=item *
33
34On Mac OS (Classic), the path separator is ':', not '/', and the
35current directory is denoted as ':', not '.'. You should be careful
36about specifying relative pathnames. While a full path always begins
37with 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
c07a80fd 42=cut
43
44require 5.000;
45use Carp;
46use Symbol;
47
48sub 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
59sub DESTROY {
60 my ($dh) = @_;
28ee7c39
SP
61 # Don't warn about already being closed as it may have been closed
62 # correctly, or maybe never opened at all.
63 no warnings 'io';
c07a80fd 64 closedir($dh);
65}
66
67sub open {
68 @_ == 2 or croak 'usage: $dh->open(DIRNAME)';
69 my ($dh, $dirname) = @_;
70 opendir($dh, $dirname);
71}
72
73sub close {
74 @_ == 1 or croak 'usage: $dh->close()';
75 my ($dh) = @_;
76 closedir($dh);
77}
78
79sub read {
80 @_ == 1 or croak 'usage: $dh->read()';
81 my ($dh) = @_;
82 readdir($dh);
83}
84
85sub rewind {
86 @_ == 1 or croak 'usage: $dh->rewind()';
87 my ($dh) = @_;
88 rewinddir($dh);
89}
90
911;