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('system')"; } ); 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;