File Coverage

blib/lib/IO/File.pm
Criterion Covered Total %
statement 32 35 91.4
branch 11 18 61.1
condition 3 8 37.5
subroutine 8 8 100.0
pod 2 2 100.0
total 56 71 78.8


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             my $fh = IO::File->new();
14             if ($fh->open("< file")) {
15             print <$fh>;
16             $fh->close;
17             }
18              
19             my $fh = IO::File->new("> file");
20             if (defined $fh) {
21             print $fh "bar\n";
22             $fh->close;
23             }
24              
25             my $fh = IO::File->new("file", "r");
26             if (defined $fh) {
27             print <$fh>;
28             undef $fh; # automatically closes the file
29             }
30              
31             my $fh = IO::File->new("file", O_WRONLY|O_APPEND);
32             if (defined $fh) {
33             print $fh "corge\n";
34              
35             my $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             =back
97              
98             =head1 NOTE
99              
100             Some operating systems may perform C or C
101             on a directory without errors. This behavior is not portable and not
102             suggested for use. Using C and C or C are
103             suggested instead.
104              
105             =head1 SEE ALSO
106              
107             L,
108             L,
109             L,
110             L,
111             L
112              
113             =head1 HISTORY
114              
115             Derived from FileHandle.pm by Graham Barr EFE.
116              
117             =cut
118              
119 11     11   651894 use 5.008_001;
  11         60  
120 11     11   63 use strict;
  11         29  
  11         383  
121 11     11   58 use Carp;
  11         23  
  11         1051  
122 11     11   3485 use Symbol;
  11         9381  
  11         860  
123 11     11   3806 use SelectSaver;
  11         1959  
  11         358  
124 11     11   4485 use IO::Seekable;
  11         50  
  11         6956  
125              
126             require Exporter;
127              
128             our @ISA = qw(IO::Handle IO::Seekable Exporter);
129              
130             our $VERSION = "1.55";
131              
132             our @EXPORT = @IO::Seekable::EXPORT;
133              
134             eval {
135             # Make all Fcntl O_XXX constants available for importing
136             require Fcntl;
137             my @O = grep /^O_/, @Fcntl::EXPORT;
138             Fcntl->import(@O); # first we import what we want to export
139             push(@EXPORT, @O);
140             };
141              
142             ################################################
143             ## Constructor
144             ##
145              
146             sub new {
147 10     10 1 763232 my $type = shift;
148 10   50     81 my $class = ref($type) || $type || "IO::File";
149 10 50 33     62 @_ >= 0 && @_ <= 3
150             or croak "usage: $class->new([FILENAME [,MODE [,PERMS]]])";
151 10         82 my $fh = $class->SUPER::new();
152 10 100       43 if (@_) {
153 7 50       31 $fh->open(@_)
154             or return undef;
155             }
156 10         51 $fh;
157             }
158              
159             ################################################
160             ## Open
161             ##
162              
163             sub open {
164 11 50 33 11 1 147 @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])';
165 11         963 my ($fh, $file) = @_;
166 11 100       40 if (@_ > 2) {
167 4         14 my ($mode, $perms) = @_[2, 3];
168 4 50       31 if ($mode =~ /^\d+$/) {
    100          
169 0 0       0 defined $perms or $perms = 0666;
170 0         0 return sysopen($fh, $file, $mode, $perms);
171             } elsif ($mode =~ /:/) {
172 2 50       347 return open($fh, $mode, $file) if @_ == 3;
173 0         0 croak 'usage: $fh->open(FILENAME, IOLAYERS)';
174             } else {
175 2         27 return open($fh, IO::Handle::_open_mode_string($mode), $file);
176             }
177             }
178 7         822 open($fh, $file);
179             }
180              
181             1;