Filehandle-Tying Methods
For our extended example, we’ll create a filehandle that uppercases strings that
are printed to it. Just for kicks, we’ll begin the file with
<SHOUT> when it’s opened
and end with </SHOUT> when
it’s closed. That way we can rant in well-formed XML.
Here’s the top of our Shout.pm file that will implement the class:
package Shout; use Carp; # So we can croak our errors
We’ll now list the method definitions in Shout.pm.
-
CLASSNAME–>TIEHANDLE(LIST) This is the constructor for the class, which as usual should return a blessed reference.
sub TIEHANDLE { my $class = shift; my $form = shift; open(my $self, $form, @_) || croak "can't open $form@_: $!"; if ($form =~ />/) { print $self "<SHOUT>\n"; $$self–>{WRITING} = 1; # Remember to do end tag } return bless $self, $class; # $self is a glob ref }Here we open a new filehandle according to the mode and filename passed to the
tieoperator, write<SHOUT>to the file, and return a blessed reference to it. There’s a lot of stuff going on in thatopenstatement, but we’ll just point out that, in addition to the usual “open or die” idiom, themy $selffurnishes an undefined scalar toopen, which knows to autovivify it into a typeglob. The fact that it’s a typeglob is also significant, because not only does the typeglob contain the real I/O object of the file, it also contains various other handy data structures that come along for free, like a scalar ($$$self), an array (@$$self), and a hash (%$$self). (We won’t mention the subroutine, ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access