NAME
PerlIO::Util - A selection of general PerlIO utilities
VERSION
This document describes PerlIO::Util version 0.13
SYNOPSIS
use PerlIO::Util;
# utility layers
open IN, "+<:flock", ...; # with flock(IN, LOCK_EX)
open IN, "+<:creat :excl", ...; # with O_CREAT | O_EXCL
open OUT, ">:tee", $file, \*LOG;
print OUT "foo"; # print to both $file and *LOG
# utility routines
STDOUT->push_layer(scalar => \my $s);
print "foo";
print STDOUT->pop_layer(); # => scalar
print $s; # => foo
DESCRIPTION
PerlIO::Util
provides general PerlIO utilities: utility layers and utility methods.
Utility layers are a part of PerlIO::Util
, but you don't need to say use PerlIO::Util
for loading them. They are automatically loaded.
UTILITY LAYERS
:flock
The :flock
layer provides an interface to flock()
.
It tries to lock the filehandle in open()
(or binmode()
) with flock()
according to the open mode. That is, if a file is opened for writing, :flock
attempts exclusive lock (using LOCK_EX). Otherwise, it attempts shared lock (using LOCK_SH).
It waits until the lock is granted. If an argument non-blocking
(or LOCK_NB
) is suplied, the call of open()
fails when the lock cannot be granted.
For example:
# tries shared lock, or waits until the lock is granted
open IN, "<:flock", $file;
open IN, "<:flock(blocking)", $file; # ditto.
# tries shared lock, or returns undef
open IN, "<:flock(non-blocking)", $file;
open IN, "<:flock(LOCK_NB)", $file; # ditto.
See "flock" in perlfunc.
:creat
:excl
They append O_CREAT or O_EXCL to the open flags.
When you'd like to create a file but not to truncate it, then you can use the :creat
layer with the open mode '<' or '+<'.
open(IO, '+< :creat', $file);
When you'd like to create a file only if it doesn't exist before, then you can use the :excl
layer with the :creat
layer and '<' or '+<'.
open(IO, '+< :excl :creat', $file);
That is, it is used to emulate a part of sysopen()
without Fcntl
.
:tee
The :tee
layer provides a multiplex output stream like tee(1)
command. It is used to make a filehandle write to one or more files (or scalars via the :scalar
layer) at the same time.
You can use push_layer()
(defined in PerlIO::Util
) to add a source to a filehandle. The source may be a file name, a scalar reference, or a filehandle. For example:
$fh->push_layer(tee => $file); # meaning "> $file"
$fh->push_layer(tee => ">>$file");# append mode
$fh->push_layer(tee => \$scalar); # via :scalar
$fh->push_layer(tee => \*OUT); # shallow copy, not duplication
You can also use :tee
with multiple arguments. However, it is just a syntax sugar to call push_layer()
: One :tee
layer has a single extra filehandle, so arguments $x, $y, $z
, for example, provides a filehandle with one :perlio
layer and two :tee
layers that have a filehandle with :perlio
internally.
open my $tee, '>:tee', $x, $y, $z;
# the code above means:
# open my $tee, '>', $x;
# $tee->push_layer(tee => $y);
# $tee->push_layer(tee => $z);
$tee->get_layers(); # => "perlio", "tee($y)", "tee($z)"
$tee->pop_layer(); # "tee($z)" is popped
$tee->pop_layer(); # "tee($y)" is popped
# now $tee is a filehandle only to $x
This layer is EXPERIMENTAL.
UTILITY METHODS
PerlIO::Util->open($mode, @args)
Calls built-in open()
, and returns an anonymus IO::Handle
instance. It dies on fail.
Unlike Perl's open()
(nor IO::File
's), $mode is always required.
PerlIO::Util->known_layers()
Returns the known layer names.
FILEHANDLE->get_layers()
Returns the names of the PerlIO layers on FILEHANDLE.
See "Querying the layers of filehandles" in PerlIO.
FILEHANDLE->push_layer(layer [ => arg])
Equivalent to binmode(*FILEHANDLE, ':layer(arg)')
, but accepts any type of arg, e.g. a scalar reference to the :scalar
layer.
This method dies on fail. Otherwise, it returns FILEHANDLE.
FILEHANDLE->pop_layer()
Equivalent to binmode(*FILEHANDLE, ':pop')
. It removes a top level layer from FILEHANDLE, but note that you cannot remove dummy layers such as :utf8
or :flock
.
This method returns the name of the poped layer.
DEPENDENCIES
Perl 5.8.0 or later.
BUGS
No bugs have been reported.
Please report any bugs or feature requests to <gfuji (at) cpan.org>, or through the web interface at http://rt.cpan.org/.
SEE ALSO
"flock" in perlfunc for :flock
.
"sysopen" in perlfunc for :creat
and :excl
.
PerlIO for push_layer()
and pop_layer()
.
perliol for implementation details.
AUTHOR
Goro Fuji (藤 吾郎) <gfuji (at) cpan.org>
LICENCE AND COPYRIGHT
Copyright (c) 2008, Goro Fuji <gfuji (at) cpan.org>. Some rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.