2013-09-22 4 views
1

Я написал следующий короткий скрипт, и я продолжаю получать ошибки:Hash Tables ниток в Perl

Invalid value for shared scalar at E:\Scripts\Threads.pl line 19. 

Я не знаю, почему, так как я с помощью общих значений в общем массиве.

use strict; 
use threads; 
use threads::shared; 

my $totalInstances = 0; 
my $totalDest = 0; 
my $totalResults = 0; 
my @threads = threads->self(); 
my @resultsHash : shared =(); 
my $dest : shared =(); 
my $hostname : shared =(); 
my @destinations : shared =(); 
my @hostnames : shared =(); 
@destinations={"London","NYC"}; 
@hostnames={"wev1010","web1111"}; 




foreach $dest (@destinations) { 
    foreach $hostname (@hostnames) { 
    push @threads, threads->new(\&ParsingResponse,$hostname,$dest); 

    } 
    sleep(6); 
} 

foreach (@threads) { 
    my $retval = eval ($_->join()); 
    if ([email protected]) { 
    print ERRFILE "Thread failed: [email protected]"; 
    } 
} 

########################################### 
# Parsing response 
# 
########################################### 
sub ParsingResponse 
{ 
    push @resultsHash, {    
    dest => "$dest", 
    hostname => "$hostname", 

    } 

} 

Line 19 в моем коде: @destinations = { "Лондон", "NYC"};

Обновленный сценарий:

use strict; 
use threads; 
use threads::shared; 

our @threads = threads->self(); 
our %resultsHash : shared =(); 
our $dest : shared =(); 
our $hostname : shared =(); 
our @destinations : shared =(); 
our @hostnames : shared =(); 

@destinations[0]="London"; 
@destinations[1]="Paris"; 
@hostnames[0]="wev1010"; 
@hostnames[1]="web1111"; 

sub ParsingResponse 
{ 

$resultsHash{$dest}= "$hostname"; 

} 



foreach $dest (@destinations) { 

     foreach $hostname (@hostnames) { 

    push @threads, threads->new(\&ParsingResponse,$hostname,$dest); 

     }  
} 



foreach (@threads) { 

     my $retval = eval ($_->join()); 

     if ([email protected]) { 

       print "Thread failed: [email protected]"; 

    } 
} 
+0

Какая из них - строка 19? В вашем фрагменте строка 19 - пустая строка. –

+0

@ destinations = {"Лондон", "Нью-Йорк Сити"}; –

+4

Вы пытаетесь использовать многопоточность для некоторых проблем, но это, вероятно, неправильное решение. Вы, кажется, не знаете много Perl, например. массивы инициализируются как '@array = (" foo "," bar ")' - не завитки! Это 'eval ($ _-> join())' не будет делать то, что вы хотите! Избегайте общих данных, если это возможно, и перечитайте [поток :: shared docs] (http://p3rl.org/threads::shared). Для связи между потоками вы должны использовать ['Thread :: Queue'] (http://p3rl.org/Thread::Queue). – amon

ответ

3

@destinations является общим, но хэш, созданный { } не является. Использовать

@destinations = share({"London","NYC"}); 

Но, как указывает sundar, вы, вероятно, не хотите иметь хэш в первую очередь.

@destinations = ("London", "NYC"); 
+1

Желание OP, скорее всего, назначить элементы массиву, а не создавать хэш-представление анонов и назначить для него одну ссылку. – sundar

+0

Я использую хэш, я просто дал здесь очень короткую версию сценария, который у меня есть. Когда я использовал @destinations = share ({«Лондон», «NYC»}); Я получил следующую ошибку: –

+0

Вероятно, что-то не так между этим назначением '@ destination' и циклом foreach', я бы рекомендовал вам пройти через http://perldoc.perl.org/perldata.html, прежде чем пытаться работать на более глубокие темы, такие как потоки. – sundar