use File::Map qq(map_file);
use MCE;
use MCE::Candy;
use Path::Iterator::Rule;
my $rule = Path::Iterator::Rule->new->file->name(qr/[.](html)$/);
my $iterator = $rule->iter_fast("topdir");
open my $fh_out, ">:utf8", $self->fn_out;
my $mce = MCE->new(
gather => MCE::Candy::out_iter_fh($fh_out),
max_workers => 'auto',
user_func => \&parse_file,
)->spawn;
$mce->process($iterator);
sub parse_file {
my ( $mce, $chunk_ref, $chunk_id ) = @_;
map_file my $text, $chunk_ref->[0], '<';
my (@posts) = $text =~ m/
\<\!--XXXX:\ (\d+)--\>\<\!--YYYY:\ (\d+).+?
(?:<\!--AAAAA--\>(.*?)\<\!--\/AAAAA--\>|)
\<\!--BBBB--\>(.*?)\<\!--\/BBBB--\>.+?
\<\!--CCCC--\>(.+?)\<\!--\/CCCC--\>
/msgx;
… Do some stuff with posts and place
results in multiline string $output
$mce->gather( $chunk_id, $output );
}
####
Use File::Which qw(which);
sub get_dir_file_list_iter {
my $dir = shift;
my $FIND = which 'find';
my $CMD = qq/$FIND -L "$dir" -type f -print/;
return (
sub {
my $chunk_size = shift // 1;
my @ary;
while ( my $fn = <$FH> ) {
chomp $fn;
push( @ary, $fn );
last if @ary == $chunk_size;
}
return (@ary);
}
);
}
####
use MCE;
use MCE::Candy;
my $iterator = get_dir_file_list_iter($dir);
open my $fh_out, ">, $ fn_out;
my $mce = MCE->new(
gather => MCE::Candy::out_iter_fh($fh_out),
chunk_size => $iter_file_ct,
max_workers => $max_workers,
user_func => \&parse_files,
)->spawn;
$mce->process($iterator);
$mce->shutdown()
);