2013-03-22 70 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); 
} 
相关问题