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

Emile Aben emileaben at gmail.com
Mon Dec 11 22:48:36 PST 2006


Hi,

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.

Simple example of use:
reading a gzipped file from disk, and calculating the md5 (using md5,
md5sum or 'openssl md5' command, depending on your OS) and linecount
(wc -l) **

I've looked into IPC::Run a bit, and IPC::Run might be able to do
something like this, but
the best I've been able to come up with this far doesn't work:
----
#!/usr/bin/env perl
use Carp;
use strict;
use warnings;
use IPC::Run qw(run);

my $cat_cmd = ['cat'];
my $md5_cmd = ['/usr/bin/openssl','md5'];
my $wc_cmd = ['wc','-l'];

my $md5_out = undef;
my $wc_out = undef;

run($cat_cmd,'<',"$0", '>&3', '>&4',
  '3>pipe', $md5_cmd, '>', \$md5_out,
  '4>pipe', $wc_cmd,   '>', \$wc_out);

print "linecount: $wc_out\n";
---
which produces errors:
Not a GLOB reference at /usr/lib/perl5/site_perl/5.8.3/IPC/Run/IO.pm line 329.
Not a GLOB reference at /usr/lib/perl5/site_perl/5.8.3/IPC/Run/IO.pm line 329.

or under perl -d:
        IPC::Run::start('ARRAY(0x98ee6a8)','<','./ipcrun.pl','>&3','>&4','3>pipe','ARRAY(0x98ee714)','>','SCALAR(0x97efce0)',...)
called at /usr/lib/perl5/site_perl/5.8.3/IPC/Run.pm line 1434
     IPC::Run::run('ARRAY(0x98ee6a8)','<','./ipcrun.pl','>&3','>&4','3>pipe','ARRAY(0x98ee714)','>','SCALAR(0x97efce0)',...)
called at ./ipcrun.pl line 14

that's enough for me tonight.

Emile


** both calculating md5 and linecount can be done in perl as well of
course, but that's not the point here


More information about the San-Diego-pm mailing list