2011-06-14 14 views
0

のハッシュとスレッド。Perlは私がスレッドを持つ配列のハッシュを共有しようとしています::共有モジュールを以下のように配列

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

my @allThreads; 
share (my %array); 

foreach ('alpha', 'beta', 'gamma') 
{ 
    $name = $_; 
    push @allThreads, threads->new(\&doWork, $name); 
} 

foreach my $thread (@allThreads){ $thread->join; } # Wait for all threads to join. 

sub doWork 
{ 
    $tempName = shift; 
    my @results = `/bin/ls /home/*`; 
    doMoreWork($tempName, @results); 
} 

sub doMoreWork 
{ 
    my $myName = shift; 
    my @tempResults = @_; 
    foreach (0 .. $#tempResults) 
    { 
     if($tempResults[$_] =~ /(\w+)/) 
     { 
      my $x = $1; 
      $array{$x} = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
     } 
    } 
} 

foreach (keys %array) 
{ 
    print "$array{$_}->[3]\n"; 
} 

私は次のエラーを取得する:myCode.plで使用中 "はrefs" ながら

はARRAYのリファレンスとして文字列( "11")を使用することはできません。

Iは、配列要素によって、アレイのこの共有ハッシュをソートする必要があります。

ご協力いただければ幸いです。

答えて

3

あなたdoWork関数はスカラーコンテキストで@tempを評価しています。だから効果的に$array{$tempName} = 11をやっている。

temp変数を省略することもできます。[ ... ]はすでに配列参照を作成しています。

sub doMoreWork 
{ 
    my $myName = shift; 
    my @tempResults = @_; 
    if(/(\w+)/) 
    { 
     my $x = $1; 
     share (my @temp); 
     @temp = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); 
     $array{$x} = \@temp; 
    } 
} 

...しかし/(\w+)/は意味のあるものに一致していないので、何も有効ではありません。

sub doWork 
{ 
    $tempName = shift; 
    $array{$tempName} = [1 .. 11]; 
} 

[編集]

はdoMoreWorkのこのバージョンには、少なくともを実行します。私はあなたがいつもここhttps://github.com/PabloK/ThreadedArray それは、配列内の要素の集合上で作業を簡素化することを目指していた私の簡素化のプロジェクトを使用して試すことができます...あなたがここでやろうと何

+0

@Nemo:私は '$配列{$ TEMPNAME} =(1、2、...、11)を試みた;' しかしながら、それは今、このエラーを与える:無効コンテキスト内の文字列の 無駄な使用をmyCode.pl – Wilderness

+0

で私の例では、$配列$ {}の一時にすなわち「11」、それは最後の値を代入し – Nemo

+0

...角括弧ではなく、括弧を使用しています。 – Wilderness

1

を伝えることはできません。

関連する問題