#!/usr/bin/perl use strict; use warnings; # Requires MCE 1.830. Fixes MCE::Relay stalling from setting $/. use MCE::Loop 1.830; my $mbnum = $ARGV[0] or die "usage: $0 mbnum\n"; my @ldif_files = qw( /path/to/file1.ldif.bz2 /path/to/file2.ldif.bz2 /path/to/file3.ldif.bz2 ); MCE::Loop->init( max_workers => scalar @ldif_files, chunk_size => 1, init_relay => '' ); mce_loop { # my ($mce, $chunk_ref, $chunk_id) = @_; # When chunk_size 1 is specified, $_ contains # the same value as $chunk_ref->[0]. my ($file, $ret) = ($_, ''); # Must localize $/ to not stall MCE, fixed in 1.830. # Localizing $/ is recommended, but fixed MCE if not. local $/ = ""; open my $fh, "-|", "/usr/bin/bzcat $file" or warn "open error ($file): $!"; if (defined fileno($fh)) { while (<$fh>) { if (/uid=$mbnum/m) { $ret = "## $file\n"; $ret .= $_; last; } } close $fh; } # Relay is beneficial for running a code block serially # and orderly. The init_relay option enables MCE::Relay. # All participating workers must call relay. Here, workers # write to STDOUT orderly starting with chunk_id 1. MCE::relay { print $ret }; } \@ldif_files; MCE::Loop->finish;