在perl中系统地排序数组

时间:2018-01-17 07:53:34

标签: perl

我有一些问题,如何更系统地输出

1 个答案:

答案 0 :(得分:1)

好的,所以你在这里遇到了一个问题 - 你在一个工人中做了print,那是在async区内。

线程的整点和async表示执行顺序未定义,因此您根本无法获得预期和期望的结果。

如果您希望对数据进行排序,则需要对数据进行整理和后处理。

因此,定义一个输出队列,将结果排入队列,并在结束线程后对它们进行整理。

这样的事情:

#!/usr/bin/perl
use warnings qw( all );
use threads;
use Thread::Queue qw( );

my $output_q = Thread::Queue -> new; 

use constant NUM_WORKERS => 10;

sub worker {
   my ($core) = @_;

   @data1 = qw(john amount );
   @data2 = qw(test1 test2 );
   foreach $loop1 (@data1) {
      foreach $loop2 (@data2) {

         #print("$core $loop1 $loop2\n");
         $output_q -> enqueue ( "$core $loop1 $loop2" ); 
      }
   }
}
{
   my $core_data = "data.txt";
   open( my $core_dat, '<', $core_data )
     or die("Can't open \"$core_data\": $!\n");

   my $q = Thread::Queue->new();
   for ( 1 .. NUM_WORKERS ) {
      async {
         while ( defined( my $core = $q->dequeue() ) ) {
            worker($core);
         }
      };
   }

   while ( my $file = <$core_dat> ) {
      chomp($file);
      $q->enqueue($file);
   }

   $q->end();

   $_->join() for threads->list();
   $output_q -> end; 
   #dequeue everything from $output_q and then sort it. 
   print join "\n", sort $output_q->dequeue_nb($output_q -> pending); 
}

注意 - 这将为每个结果传回一个字符串,然后对其进行排序。那个可能不完全是你想要的(虽然它会根据你到目前为止的工作而工作)。

你可以举例如:

$output_q -> enqueue ( [ $core, $loop1, $loop2 ]); 

然后将每个$output_q项视为数组引用,并根据该项进行排序。如果这是你想要走下去的道路,我会建议最好把它作为另一个问题。