Okay, I got rid of the hash and used blessed typeglobs, just because I'm that kinda guy and I want the approval of heroes like
chip and
merlyn and
Damian.
package Filter::Handle;
use strict;
use vars qw/@ISA/;
use Tie::Handle; @ISA = qw/Tie::Handle/;
sub TIEHANDLE {
my $class = shift;
my $fh = shift;
bless $fh, $class;
}
sub new {
my $class = shift;
my $fh = shift;
my $sub = shift;
*fh = $sub;
tie *{$fh}, __PACKAGE__, $fh;
bless $fh, $class;
}
sub DESTROY {
my $self = shift;
my $fh = *{ $self };
{ local $^W = 0; untie *{$fh} }
}
sub PRINT {
my $self = shift;
my $fh = *$self;
my $code = *fh{CODE};
die "No output handler installed"
unless defined $code;
print $fh $code->(@_);
}
sub CLOSE { }
You can pass an anonymous sub or a sub ref to the constructor:
#!/usr/bin/perl -w
use strict;
use Filter::Handle;
local *OUTPUT;
open(OUTPUT, ">handle.txt") || die "Can't open: $!";
my $fh = \*OUTPUT;
my $f = Filter::Handle->new($fh,
sub {
my($file, $line) = (caller(1))[1,2];
return sprintf "%s:%d - %s\n", $file, $line, @_;
});
print OUTPUT "Foo";
print OUTPUT "Bar";
Yeah, that's pretty evil. But hey, why not?
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.