2013-03-22 3 views
1

У меня есть хэш массивов. Я пытаюсь сделать следующее: когда я перебираю ключи хеша, я хотел бы передать значение хэша (в данном случае массива) в подпрограмму.Как передать значение хеша массивов в подпрограмму?

Как только я буду в подпрограмме, я хотел бы сделать кучу вычислений с массивом, включая среднее значение числовых значений в массиве. Наконец, верните значение, основанное на вычислениях.

Вот минимальное представление о том, что у меня есть:

#!/usr/bin/perl 
use warnings; use strict; 
use List::Util qw(sum); 

%data_set = (
    'node1' => ['1', '4', '5', '2'], 
    'node2' => ['3', '2', '4', '12'], 
    'node3' => ['5', '2', '3', '6'], 
    ); 

foreach my $key (keys %data_set) { 
    foreach (@{$data_set{$key}}) { 
     my @array = split; # it's not letting me 
     calculate(\@array); ### I'm getting the error here!! 
    } 
} 

sub calculate{ 
    my @array = @{$_}; 
    my $average = mean(\@array); 
    # do some more calculations 
    return; # return something 
} 

# sum returns the summation of all elements in the array 
# dividing by @_ (which in scalar content gives the # of elements) returns 
# the average 
sub mean{ 
    return sum(@_)/@_; 
} 

Краткое пояснение: На первой итерации node1, я хотел бы передать массив '1', '4', '5', '2' в подпрограмму.

Я думаю, что для моих целей это может быть немного более эффективным, чем передача ссылки на хэш массивов в каждую подпрограмму. Ребята, что вы думаете? В любом случае, можете ли вы, ребята, помочь мне понять это? Любые предложения приветствуются. спасибо

ответ

3

Я думаю, вы немного смущены, когда вам нужны ссылки и переменные разницы, а также то, что вы проходите, где.

Давайте посмотрим на это ближе,

foreach my $key (keys %data_set) { 
    foreach (@{$data_set{$key}}) { 
     my @array = split; # it's not letting me 
     calculate(\@array); ### I'm getting the error here!! 
    } 
} 

Вы перебираем хэша, чтобы получить ключи, но затем использовать их для доступа к значениям разыменовать массивов и разделить каждый массив в массив одного элемента (строки). Затем вы передаете ссылку на этот 1-элементный массив на calculate. В основном, вы делаете слишком много работы, если единственное, что вы хотите сделать, - передать каждое значение хэша (массивов) в подпрограмму calculate. Попробуйте что-то вроде этого:

foreach my $key (keys %data_set){ 
    calculate($data_set{$key}); # This is already a reference to an array 
} 

Кроме того, в calculate вам нужно изменить my @array = @{$_}; либо my @array = @{$_[0]}; или my @array = @{(shift)};

+0

ах хорошо. Если я хочу передать '@ array' в подпрограмму' mean', будет ли она быть: 'mean (\ @ array)'? Наконец, мне нужно внести какие-либо изменения в подпрограмму 'mean'? – cooldood3490

+1

'mean (\ @ array)' отлично, но вы должны, вероятно, еще раз взглянуть на 'mean' - что-то напуганное происходит там. – Jared

+0

ладно, я понимаю сейчас. благодаря – cooldood3490

1

Вашего среднего подпрограммы должны выглядеть примерно так:

sub mean{ 
    my @array = @{(shift)}; 
    return sum(@array)/scalar(@array); 
} 
Смежные вопросы