我没有完全理解fork函数。
如何同时打印文件的输出,为每个文件使用单独的过程?
my $regex = $ARGV[0];
for (@ARGV[1 .. $#ARGV]){
open (my $fh, "<", $_);
foreach (<$fh>){
print "$1\n" if $_ =~ /(\b$regex\b)/;
}
}
答案 0 :(得分:1)
据推测,您还希望限制同时进程的数量。 Parallel::ForkManager让这很容易。
use Parallel::ForkManager qw( );
my $pm = Parallel::ForkManager->new($MAX_PROCESSES);
my $filter = shift(@ARGV);
$filter = qr/$filter/;
for my $qfn (@ARGV) {
$pm->start() and next;
open(my $fh, '<', $qfn)
or die("Can't open \"$qfn\": $!\n");
while (<$fh>) {
print "$1\n" if /(\b$regex\b)/;
}
}
$pm->finish();
如果您不想限制同时进程的数量,它看起来会非常相似。
my $filter = shift(@ARGV);
$filter = qr/$filter/;
for my $qfn (@ARGV) {
fork() and next;
open(my $fh, '<', $qfn)
or die("Can't open \"$qfn\": $!\n");
while (<$fh>) {
print "$1\n" if /(\b$regex\b)/;
}
}
1 while wait() > 0;