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'

私の目的では、これは配列のハッシュへの参照を各サブルーチンに渡すよりも少し効率的かもしれないと思います。皆さんはどう思いますか?いずれにしても、これを理解するのを手伝ってもらえますか? 任意の提案をいただければ幸いです。ありがとう

4

2 に答える 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 つの要素配列に分割します。次に、その 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)};

于 2013-03-22T03:09:12.633 に答える
1

平均的なサブルーチンは次のようになります。

sub mean{
    my @array = @{(shift)};
    return sum(@array)/scalar(@array);
}
于 2013-03-22T04:25:35.727 に答える