This shows two other alternatives of parallel processing (not explicitly using fork).
Save this as MyChameleon.pm:
package MyChameleon;
use strict;
use warnings;
use threads;
$| = 1; # autoflush STDOUT
my $used_as_script = not caller();
if ($used_as_script) {
print "Start script\n";
my $thread_to_do = threads->create( \&to_do, 'thread', 5 );
my $thread_sys = threads->create(
sub {
system $^X, "-MMyChameleon", "-e", "MyChameleon::to_do('sy
+stem')";
}
);
to_do( 'script', 3 );
$thread_to_do->join;
$thread_sys->join;
exit;
}
sub to_do {
my ( $tag, $times ) = @_;
$times //= 10;
print "$tag: Hello World!\n";
map { print "$tag ($_)\n"; sleep 1 } ( 1 .. $times );
print "$tag: is done\n";
}
!!1;
Run it like this: “perl MyChameleon.pm”.
See also How a script becomes a module