Da der Thread im Hintergrund läuft und zeitlich irgendwann vor oder nach dem Aufruf der
join Methode seine Arbeit beenden kann, ist es ihm nicht möglich den Kontext seines Rückgabewertes aus diesem Aufruf abzuleiten.
Standardmäßig hat ein Thread Skalarkontext, weshalb in diesem Beispiel die beiden Aufrufe von
join jeweils nur die Anzahl der aufgesammelten Listenelemente zurückgeben.
Man kann den Threads aber explizit sagen, dass sie im Listenkontext laufen sollen. Ersetzt man Zeile 22-23 des Codes durch
my $thread1 = threads->new( { context => 'list' }, \&test, $from, $over );
my $thread2 = threads->new( { context => 'list' }, \&test, $over + 1, $until );
so funktioniert das Beispiel.
Alternativ kann man natürlich auch eine Arrayreferenz statt einer Liste zurückgeben.
When C++ is your hammer, every problem looks like your thumb.