NAME

PerlIO::Util - A selection of general PerlIO utilities

VERSION

This document describes PerlIO::Util version 0.21

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, @others;
print OUT "foo"; # print to $file and @others

# 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.

See "sysopen" in perlfunc.

: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 open() 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 of open(), for example, prepares a filehandle with one basic layer and two :tee layers with a internal filehandle.

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

:dir

The :dir layer provides an interface to directories.

There is an important difference from Perl's readdir(). This layer appends a newline code, \n, to the end of the name, because readline() requires input separators. Call chomp() if necesary.

open my $dir, '<:dir', '.';
my @dirs = <$dir>;    # readdir() but added "\n" at the end of the name
chomp @dirs;          # if necessary

You can call tell() and seek(), although there are some limits. seek() refuses SEEK_CUR and SEEK_END with a non-zero potition value. And tell() returns an integer that refuses any arithmetic operations.

my $pos = tell($dir); # telldir()
seek $dir, $pos, 0;   # seekdir()
seek $dir, 0, 0;      # rewinddir()

close $dir;           # closedir()

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.1 or later, and a C compiler.

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

PerlIO::flock, PerlIO::creat, PerlIO::excl, PerlIO::tee, PerlIO::dir

"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.