Skip to content
Nathan Waddell edited this page Jun 28, 2017 · 6 revisions

IO::All to Larry Wall!

IO::All combines all of the best Perl IO modules into a single nifty object oriented interface to greatly simplify your everyday Perl IO idioms. It exports a single function called io, which returns a new IO::All object. And that object can do it all!

The IO::All object is a proxy for IO::File, IO::Dir, IO::Socket, Tie::File, File::Spec, File::Path, File::MimeInfo and File::ReadBackwards; as well as all the DBM and MLDBM modules. You can use most of the methods found in these classes and in IO::Handle (which they inherit from). IO::All adds dozens of other helpful idiomatic methods including file stat and manipulation functions.

IO::All is pluggable, and modules like IO::All::LWP and IO::All::Mailto add even more functionality. Optionally, every IO::All object can be tied to itself. This means that you can use most perl IO builtins on it: readline, <>, getc, print, printf, syswrite, sysread, close.

The distinguishing magic of IO::All is that it will automatically open (and close) files, directories, sockets and other IO things for you. You never need to specify the mode (<, >>, etc), since it is determined by the usage context. That means you can replace this:

open STUFF, '<', './mystuff'
  or die "Can't open './mystuff' for input:\n$!";
local $/;
my $stuff = <STUFF>;
close STUFF;

with this:

my $stuff < io './mystuff';

And that is a good thing!

USAGE

Normally just say:

use IO::All;

and IO::All will export a single function called io, which constructs all IO objects.

Note on io

The io function is a magic constructor. It is easy to use and will usually do the right thing, but can also blow up easily.

It takes a single optional argument and determines what type of IO::All subclass object to return. With no arguments it returns an IO::All object, which has no I/O methods, but has methods to construct subclass objects like IO::All::File.

In other words, these 2 statements are usually the same:

$content = io('file.txt')->all;
$content = io->file('file.txt')->all;

Use the first form when you are demonstrating your Perl virtues of laziness and impatience, and use the second form when your job is on the line.

Clone this wiki locally