Instead of just doing timestamps, perhaps a generic "send output lines to this sub" routine is more useful:
=head1 NAME
FileHandle::Sub - an output filehandle that sends each line of output
+to a user-specified CODE block
=head1 SYNOPSIS
use FileHandle::Sub;
# grep
my $fh = FileHandle::Sub::open { /token/ and print };
# prefix
my $fh = FileHandle::Sub::open { s/^/scalar localtime/e; print };
=head1 DESCRIPTION
Each line of output sent to this file handle will be passed to the COD
+E block supplied to C<open>.
=cut
package FileHandle::Sub;
{
require 5.8.0;
use strict;
use warnings;
sub open (&)
{
local *FH;
tie *FH, __PACKAGE__, @_ or return;
return *FH;
}
sub TIEHANDLE
{
my($class, $code) = @_;
bless [$code, ""], $class;
}
sub _emit
{
my ($self, $txt) = @_;
my ($code, $prev) = @$self;
if ($txt =~ /\n$/)
{
local $_ = $prev . $txt;
$code->($_);
$prev = "";
}
else
{
$prev .= $txt;
}
$self->[1] = $prev;
}
sub PRINT
{
my ($self, @txt) = @_;
local $_;
for my $txt (@txt)
{
_emit($self, $_) for $txt =~ /[^\n]*\n?/g;
}
}
sub PRINTF
{
my ($self, $fmt, @args) = @_;
PRINT $self, sprintf $fmt, @args;
}
sub CLOSE
{
my ($self) = @_;
local $_ = $self->[1];
if (length)
{
$self->[0]->($_);
}
$self->[1] = "";
}
sub DESTROY { &CLOSE }
}
1;
--Dave Opinions my own; statements of fact may be in error.
-
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.
|