NAME
File::Open - wrap open/sysopen and give them a nice and simple interface
SYNOPSIS
use File::Open qw(fopen fopen_nothrow fsysopen fsysopen_nothrow);
my $fh = fopen $file;
my $fh = fopen $file, $mode;
my $fh = fopen $file, $mode, $layers;
my $fh = fopen_nothrow $file or die "$0: $file: $!\n";
my $fh = fopen_nothrow $file, $mode or die "$0: $file: $!\n";
my $fh = fopen_nothrow $file, $mode, $layers or die "$0: $file: $!\n";
my $fh = fsysopen $file, $mode;
my $fh = fsysopen $file, $mode, \%flags;
my $fh = fsysopen_nothrow $file, $mode or die "$0: $file: $!\n";
my $fh = fsysopen_nothrow $file, $mode, \%flags or die "$0: $file: $!\n";
DESCRIPTION
This module provides convenience wrappers around open and sysopen for opening simple files. Nothing is exported by default; you have to specify every function you want to import explicitly.
Functions
- fopen FILE
- fopen FILE, MODE
- fopen FILE, MODE, LAYERS
-
Opens FILE and returns a filehandle. If the open fails, it throws an exception of the form
"$program: $filename: $!\n"
.MODE is a string specifying how the file should be opened. The following values are supported:
'r'
,'<'
-
Open the file for reading.
'w'
,'>'
-
Open the file for writing. If the file exists, wipe out its contents and make it empty; if it doesn't exist, create it.
'a'
,'>>'
-
Open the file for appending. If the file doesn't exist, create it. All writes will go to the end of the file.
'r+'
,'+<'
-
Open the file for reading (like
'r'
) but also allow writes. 'w+'
,'+>'
-
Open the file for writing (like
'w'
) but also allow reads. 'a+'
,'+>>'
-
Open the file for appending (like
'a'
) but also allow reads.
In addition you can append a
'b'
to each of the mode strings listed above. This will cause binmode to be called on the filehandle.If you don't specify a MODE, it defaults to
'r'
.If you pass LAYERS,
fopen
will callbinmode $fh, LAYERS
on the newly opened filehandle. This gives you greater control than the simple'b'
in MODE. For example, to read from a UTF-8 file:my $fh = fopen $file, 'r', ':encoding(UTF-8)'; while (my $line = readline $fh) { ... }
See PerlIO and Encode::Supported for a list of available layers and encoding names, respectively.
- fopen_nothrow FILE
- fopen_nothrow FILE, MODE
- fopen_nothrow FILE, MODE, LAYERS
-
Works exactly like fopen but if the open fails it simply returns
undef
. - fsysopen FILE, MODE
- fsysopen FILE, MODE, FLAGS
-
Uses the more low-level interface of sysopen to open FILE. If it succeeds, it returns a filehandle; if it fails, it throws an exception of the form
"$program: $filename: $!\n"
.MODE must be
'r'
,'w'
, or'rw'
to open the file for reading, writing, or both reading and writing, respectively (this corresponds to the open flagsO_RDONLY
,O_WRONLY
, andO_RDWR
).You can pass additional flags in FLAGS, which must be a hash reference. The hash keys are strings (specifying the flag) and the values are booleans (indicating whether the flag should be off (default) or on) - with one exception. The exception is the
'creat'
flag; if set, its value must be a number that specifies the permissions of the newly created file. See "umask" in perlfunc for details.The following flags are recognized:
'append'
- setsO_APPEND
'async'
- setsO_ASYNC
'creat'
- setsO_CREAT
and specifies file permissions'direct'
- setsO_DIRECT
'directory'
- setsO_DIRECTORY
'excl'
- setsO_EXCL
'noatime'
- setsO_NOATIME
'noctty'
- setsO_NOCTTY
'nofollow'
- setsO_NOFOLLOW
'nonblock'
- setsO_NONBLOCK
'sync'
- setsO_SYNC
'trunc'
- setsO_TRUNC
See Fcntl and open(2) for the meaning of these flags. Some of them may not exist on your system; in that case you'll get a runtime exception when you try to specify a non-existent flag.
- fsysopen_nothrow FILE, MODE
- fsysopen_nothrow FILE, MODE, FLAGS
-
Works exactly like fsysopen but if the sysopen fails it simply returns
undef
.
Methods
The returned filehandles behave like IO::Handle objects (actually IO::File objects, which is a subclass of IO::Handle). However, on perl versions before 5.14.0 you have to use IO::Handle;
manually before you can call any methods on them. (Current perl versions will do this for you automatically but it doesn't hurt to load IO::Handle anyway.)
Here is a toy example that copies all lines from one file to another, using method calls instead of functions:
use File::Open qw(fopen);
use IO::Handle; # not needed on 5.14+
my $fh_in = fopen $file_in, 'r';
my $fh_out = fopen $file_out, 'w';
while (defined(my $line = $fh_in->getline)) {
$fh_out->print($line) or die "$0: $file_out: $!\n";
}
$fh_out->close or die "$0: $file_out: $!\n";
$fh_in->close;
SEE ALSO
"open" in perlfunc, "binmode" in perlfunc, "sysopen" in perlfunc, perlopentut, IO::Handle, Fcntl, open(2)
AUTHOR
Lukas Mai, <l.mai at web.de>
COPYRIGHT & LICENSE
Copyright 2011, 2013 Lukas Mai.
This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License.
See http://dev.perl.org/licenses/ for more information.