【问题标题】:How to pass value of a hash of arrays into a subroutine?如何将数组哈希的值传递给子程序?
【发布时间】:2013-03-11 19:07:59
【问题描述】:

我有一个数组哈希。我正在尝试执行以下操作:当我循环遍历散列的键时,我想将散列的值(在本例中为数组)传递到子例程中。

一旦我进入子例程,我想对数组进行一系列计算,包括取数组中数值的平均值。最后根据计算返回一个值。

这是我所拥有的最小表示:

#!/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' 传递到子例程中。

我认为就我的目的而言,这可能比将数组哈希的引用传递给每个子例程更有效。你们有什么感想?无论如何,你们能帮我解决这个问题吗?任何建议表示赞赏。谢谢

【问题讨论】:

    标签: arrays perl hash reference subroutine


    【解决方案1】:

    我认为您对何时需要引用和取消引用变量以及传递的内容和位置感到有些困惑。

    让我们仔细看看,

    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)};

    【讨论】:

    • 啊好吧。如果我想将@array 传递给mean 子例程,它是否仍然是:mean(\@array)?最后,我需要对mean 子例程进行任何更改吗?
    • mean(\@array) 很好,但您可能应该再看看mean - 那里正在发生一些时髦的事情。
    【解决方案2】:

    你的平均子程序应该是这样的:

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

    【讨论】:

      猜你喜欢
      • 2020-06-14
      • 2013-09-27
      • 2011-06-21
      • 1970-01-01
      • 2011-02-01
      • 2017-01-18
      • 2017-06-25
      • 2016-12-04
      相关资源
      最近更新 更多