在foreach循环中调用子程序N次

时间:2013-03-23 22:57:57

标签: perl hash for-loop reference subroutine

我有两个对应于以下文件的数组散列(HoA):

A   10  15  20  25
B   21  33  21  23
C   43  14  23  23
D   37  45  43  49

这是我的HoAs。

my %first_HoA = (
       'A'     => [ '10', '15', '20', '25'],
       'B'     => [ '21', '33', '21', '23'],
     );

 my %second_HoA = (
       'A'     => [ '10', '15', '20', '25'],
       'B'     => [ '21', '33', '21', '23'],
       'C'     => [ '43', '14', '23', '23'],
       'D'     => [ '37', '45', '43', '49'],
     );

对于第二个HoA(A-D)中的每个$键,我想调用一个子程序,对其相应的数组和第一个HoA(A-B)中每个 $键的数组进行计算。根据计算,子程序应从第一个HoA返回一个产生最高值的密钥。换句话说,只应为第二个HoA中的每个$ key调用子例程,并在第一个HoA中返回$ key,根据第一个HoA中键的数组计算得出最佳值。

这就是我现在的方式。假设我有一个名为calculate

的任意子程序
my $iterations = 1;
foreach my $key ( keys %second_HoA ) {

    for my $arrayref (values %first_HoA){
        calculate($first_HoA{$key}, $arrayref);
        print "Iteration: $iterations\n";
        $iterations++;
    }
}

如您所见,此调用calculate 8次。我只想为calculate中的每个$ key调用%second_HoA,这是4次,但我还需要传递$arrayref以在子例程中进行计算。

有谁知道我该怎么做?

我想要这样做的另一种方法是传递first_HoA的hash_ref,如下所示:

foreach my $key ( keys %second_HoA ) {
    calculate($second_HoA{$key}, \%first_HoA);
    print "Iteration: $iterations\n";
    $iterations++;
}

执行此操作会调用calculate 4次,这是我想要的,但它使子程序中的内容变得复杂。

任何建议。感谢。

1 个答案:

答案 0 :(得分:1)

你说calculate($second_HoA{$key}, \%first_HoA)“使事情变得复杂”,但我不知道这是怎么回事。在我看来,这是您需要的最少信息,而且它是一种方便的格式。

任何不足都会使事情变得复杂,因为你没有掌握计算所需的信息。