Perl пронизывает с помощью хэша массивов - PullRequest
0 голосов
/ 14 июня 2011

Я пытаюсь поделиться хэшем массивов с thread: shared module, как показано ниже.

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";
}

Я получаю следующую ошибку:

Невозможно использовать строку ("11") в качестве ссылки ARRAY, в то время как "строгие ссылки" используются на myCode.pl.

Мне нужно отсортировать этот общий хэш массивов по элементу массива.

Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

Ваша doWork функция оценивает @temp в скалярном контексте. Так что это эффективно делает $array{$tempName} = 11.

Также вы можете опустить переменную temp, поскольку [ ... ] уже создает ссылку на массив.

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

[править]

Эта версия doMoreWork работает как минимум:

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+)/ не соответствует ничего значащего. Я не могу сказать, что вы пытаетесь сделать здесь ...

1 голос
/ 05 декабря 2012

Вы всегда можете попробовать использовать мой упрощающий проект, найденный здесь https://github.com/PabloK/ThreadedArray Он направлен на упрощение работы над набором элементов в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...