Tying Filehandles
A class implementing a tied filehandle should define
the following methods: TIEHANDLE
and at least one
of PRINT
, PRINTF
,
WRITE
, READLINE
,
GETC
, and READ
. The class can
also provide a DESTROY
method, and
BINMODE
, OPEN
,
CLOSE
, EOF
,
FILENO
, SEEK
,
TELL
, READ
, and
WRITE
methods to enable the corresponding Perl
built-ins for the tied filehandle. (Well, that isn't quite true:
WRITE
corresponds to syswrite
and has nothing to do with Perl's built-in write
function for printing with format
declarations.)
Tied filehandles are especially useful when Perl is embedded in
another program (such as Apache or vi) and output
to STDOUT
or STDERR
needs to be
redirected in some special way.
But filehandles don't actually have to be tied to a
file at all. You can use output statements to build up an in-memory
data structure and input statements to read them back in. Here's an
easy way to reverse a sequence of print
and
printf
statements without reversing the individual
lines:
package ReversePrint; use strict; sub TIEHANDLE { my $class = shift; bless [], $class; } sub PRINT { my $self = shift; push @$self, join '', @_; } sub PRINTF { my $self = shift; my $fmt = shift; push @$self, sprintf $fmt, @_; } sub READLINE { my $self = shift; pop @$self; } package main; my $m = "--MORE--\n"; tie *REV, "ReversePrint"; # Do some prints and printfs. print REV "The fox is now dead.$m"; printf REV <<"END", int rand 10000000; The quick brown fox jumps over over the lazy dog %d times! END print REV ...
Get Programming Perl, 3rd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.