Как передать значение хеша массивов в подпрограмму?

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

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

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

#!/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' в подпрограмму.

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


person cooldood3490    schedule 22.03.2013    source источник


Ответы (2)


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

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

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!!
    }
}

Вы перебираете хэш, чтобы получить ключи, но затем используете их для доступа к значениям для разыменования массивов и разбиваете каждый массив на один массив элементов (строки). Затем вы передаете ссылку на этот одноэлементный массив в 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)};.

person Jared    schedule 22.03.2013
comment
Ах хорошо. Если я хочу затем передать @array подпрограмме mean, будет ли это по-прежнему: mean(\@array)? Наконец, нужно ли мне внести какие-либо изменения в подпрограмму mean? - person cooldood3490; 22.03.2013
comment
mean(\@array) в порядке, но вам, вероятно, следует еще раз взглянуть на mean — там происходит что-то странное. - person Jared; 22.03.2013

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

sub mean{
    my @array = @{(shift)};
    return sum(@array)/scalar(@array);
}
person imran    schedule 22.03.2013