File Coverage

blib/lib/IO/File.pm
Criterion Covered Total %
statement 35 39 89.7
branch 13 22 59.0
condition 4 11 36.3
subroutine 9 9 100.0
pod 3 3 100.0
total 64 84 76.1


line stmt bran cond sub pod time code
1             #
2              
3             package IO::File;
4              
5             =head1 NAME
6              
7             IO::File - supply object methods for filehandles
8              
9             =head1 SYNOPSIS
10              
11             use IO::File;
12              
13             $fh = IO::File->new();
14             if ($fh->open("< file")) {
15             print <$fh>;
16             $fh->close;
17             }
18              
19             $fh = IO::File->new("> file");
20             if (defined $fh) {
21             print $fh "bar\n";
22             $fh->close;
23             }
24              
25             $fh = IO::File->new("file", "r");
26             if (defined $fh) {
27             print <$fh>;
28             undef $fh; # automatically closes the file
29             }
30              
31             $fh = IO::File->new("file", O_WRONLY|O_APPEND);
32             if (defined $fh) {
33             print $fh "corge\n";
34              
35             $pos = $fh->getpos;
36             $fh->setpos($pos);
37              
38             undef $fh; # automatically closes the file
39             }
40              
41             autoflush STDOUT 1;
42              
43             =head1 DESCRIPTION
44              
45             C inherits from C and C. It extends
46             these classes with methods that are specific to file handles.
47              
48             =head1 CONSTRUCTOR
49              
50             =over 4
51              
52             =item new ( FILENAME [,MODE [,PERMS]] )
53              
54             Creates an C. If it receives any parameters, they are passed to
55             the method C; if the open fails, the object is destroyed. Otherwise,
56             it is returned to the caller.
57              
58             =item new_tmpfile
59              
60             Creates an C opened for read/write on a newly created temporary
61             file. On systems where this is possible, the temporary file is anonymous
62             (i.e. it is unlinked after creation, but held open). If the temporary
63             file cannot be created or opened, the C object is destroyed.
64             Otherwise, it is returned to the caller.
65              
66             =back
67              
68             =head1 METHODS
69              
70             =over 4
71              
72             =item open( FILENAME [,MODE [,PERMS]] )
73              
74             =item open( FILENAME, IOLAYERS )
75              
76             C accepts one, two or three parameters. With one parameter,
77             it is just a front end for the built-in C function. With two or three
78             parameters, the first parameter is a filename that may include
79             whitespace or other special characters, and the second parameter is
80             the open mode, optionally followed by a file permission value.
81              
82             If C receives a Perl mode string ("E", "+E", etc.)
83             or an ANSI C fopen() mode string ("w", "r+", etc.), it uses the basic
84             Perl C operator (but protects any special characters).
85              
86             If C is given a numeric mode, it passes that mode
87             and the optional permissions value to the Perl C operator.
88             The permissions default to 0666.
89              
90             If C is given a mode that includes the C<:> character,
91             it passes all the three arguments to the three-argument C operator.
92              
93             For convenience, C exports the O_XXX constants from the
94             Fcntl module, if this module is available.
95              
96             =item binmode( [LAYER] )
97              
98             C sets C on the underlying C object, as documented
99             in C.
100              
101             C accepts one optional parameter, which is the layer to be
102             passed on to the C call.
103              
104             =back
105              
106             =head1 NOTE
107              
108             Some operating systems may perform C or C
109             on a directory without errors. This behavior is not portable and not
110             suggested for use. Using C and C or C are
111             suggested instead.
112              
113             =head1 SEE ALSO
114              
115             L,
116             L,
117             L,
118             L,
119             L
120              
121             =head1 HISTORY
122              
123             Derived from FileHandle.pm by Graham Barr EFE.
124              
125             =cut
126              
127 11     11   185682 use 5.008_001;
  11         65  
128 11     11   54 use strict;
  11         19  
  11         225  
129 11     11   46 use Carp;
  11         14  
  11         559  
130 11     11   2836 use Symbol;
  11         4825  
  11         531  
131 11     11   2628 use SelectSaver;
  11         1428  
  11         247  
132 11     11   2716 use IO::Seekable;
  11         22  
  11         4803  
133              
134             require Exporter;
135              
136             our @ISA = qw(IO::Handle IO::Seekable Exporter);
137              
138             our $VERSION = "1.48";
139              
140             our @EXPORT = @IO::Seekable::EXPORT;
141              
142             eval {
143             # Make all Fcntl O_XXX constants available for importing
144             require Fcntl;
145             my @O = grep /^O_/, @Fcntl::EXPORT;
146             Fcntl->import(@O); # first we import what we want to export
147             push(@EXPORT, @O);
148             };
149              
150             ################################################
151             ## Constructor
152             ##
153              
154             sub new {
155 10     10 1 12896 my $type = shift;
156 10   50     67 my $class = ref($type) || $type || "IO::File";
157 10 50 33     58 @_ >= 0 && @_ <= 3
158             or croak "usage: $class->new([FILENAME [,MODE [,PERMS]]])";
159 10         63 my $fh = $class->SUPER::new();
160 10 100       28 if (@_) {
161 7 50       28 $fh->open(@_)
162             or return undef;
163             }
164 10         56 $fh;
165             }
166              
167             ################################################
168             ## Open
169             ##
170              
171             sub open {
172 11 50 33 11 1 148 @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
173 11         30 my ($fh, $file) = @_;
174 11 100       30 if (@_ > 2) {
175 4         20 my ($mode, $perms) = @_[2, 3];
176 4 50       25 if ($mode =~ /^\d+$/) {
    100          
177 0 0       0 defined $perms or $perms = 0666;
178 0         0 return sysopen($fh, $file, $mode, $perms);
179             } elsif ($mode =~ /:/) {
180 2 50       136 return open($fh, $mode, $file) if @_ == 3;
181 0         0 croak 'usage: $fh->open(FILENAME, IOLAYERS)';
182             } else {
183 2         16 return open($fh, IO::Handle::_open_mode_string($mode), $file);
184             }
185             }
186 7         384 open($fh, $file);
187             }
188              
189             ################################################
190             ## Binmode
191             ##
192              
193             sub binmode {
194 1 50 33 1 1 3 ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])';
195              
196 1         2 my($fh, $layer) = @_;
197              
198 1 50       5 return binmode $$fh unless $layer;
199 0           return binmode $$fh, $layer;
200             }
201              
202             1;