#! perl -slw use strict; use Time::HiRes qw[ sleep ]; use Data::Dump qw[ pp ]; use threads; use threads::shared; my $done :shared = 0; sub checkStuff { sleep rand( 5 ); return { split ' ', $_[0] }; } my $finisher = async { while( sleep 0.1 and not $done ) { for my $thr ( threads->list( threads::joinable ) ) { my $hRef = $thr->join; printf "From tid:%d got %s\n", $thr->tid, pp $hRef; } } }; while( <> ) { next unless /ACK (.+)$/; async \&checkStuff, $1; } sleep 0.1 while threads->list( threads::running ) > 1; sleep 0.1 while threads->list( threads::joinable ); $done = 1; $finisher->join; __END__ [15:14:01.92] c:\test>856740-2 ACK A 1 B 2 C 3 junk ACK A 1 B 2 C 3 ACK A 1 B 2 C 3From tid:2 got { A => 1, B => 2, C => 3 } junk ACK A 1 B 2 C 3 junk junkFrom tid:3 got { A => 1, B => 2, C => 3 } ACK A 1 B 2 C 3From tid:4 got { A => 1, B => 2, C => 3 } junk ^Z From tid:5 got { A => 1, B => 2, C => 3 }