2013-03-22 99 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 2013-03-22 03:22:48

+1

'mean(\ @ array)'很好,但你應該再看一下'mean' - 這裏有一些奇怪的事情發生。 – Jared 2013-03-22 03:26:12

+0

好吧,我現在明白了。謝謝 – cooldood3490 2013-03-22 03:32:03

1

你的意思應該子程序看起來是這樣的:

sub mean{ 
    my @array = @{(shift)}; 
    return sum(@array)/scalar(@array); 
} 
相關問題