[San-Diego-pm] Module idea for input/output multiplexing

Chris Grau chris at chrisgrau.com
Wed Dec 13 00:42:44 PST 2006


On Mon, Dec 11, 2006 at 10:48:36PM -0800, Emile Aben wrote:
> Module idea from discussion at the meeting tonight:
> A module that hooks up stdout from one process with the stdin of
> several other processes, or maybe more generic: Something that reads
> from a filehandle and writes that output to several other filehandles.

I like the tee(1) example in shell, but I was itching to write it in
Perl.  So here's what I came up with in the last half hour or so.

--[ print.pl ]----------------------------------------------------------
#!/usr/bin/perl

print "$ARGV[0]: $_" while <STDIN>;
--[ __END__ ]-----------------------------------------------------------

I only wrote print.pl because cat(1) buffers its output and so didn't
serve my example very well.

--[ multi.pl ]----------------------------------------------------------
#!/usr/bin/perl

use strict;
use warnings;

my $proc = Proc::Multiplex->new;

$proc->add('./print.pl one');
$proc->add('./print.pl two');

# sleep between writes to prove I/O isn't being buffered
$proc->write("foo\n");
sleep 1;
$proc->write("bar\n");
sleep 1;
$proc->write("baz\n");

package Proc::Multiplex;

sub new {
    bless { fh => [] };
}

sub add {
    my ( $self, $cmd ) = @_;

    open my $fh, '|-', $cmd or die "$cmd: $!";
    my $oldfh = select $fh; $| = 1; select $oldfh;
    push @{ $self->{fh} }, $fh;
}

sub write {
    my ( $self, $data ) = @_;

    print {$_} $data for @{ $self->{fh} };
}
--[ __END__ ]-----------------------------------------------------------

[cgrau at quendor ~]$ perl multi.pl 
two: foo
one: foo
one: bar
two: bar
one: baz
two: baz

Now it just needs a pinch of syntactic sugar and a dash of robustness.
Though, odds are something like this already exists on the CPAN.

-chris
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/san-diego-pm/attachments/20061213/8e78da18/attachment.bin 


More information about the San-Diego-pm mailing list