【问题标题】:Calling subroutine N number of times within a foreach loop在 foreach 循环内调用子例程 N 次
【发布时间】:2013-03-23 22:57:56
【问题描述】:

我有两个对应于以下文件的数组哈希 (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) 中的每个 $key,我想调用一个子例程,对其对应的数组和第一个 HoA (A-B) 中的 every $key 数组进行计算。根据计算,子例程应该从产生最高值的第一个 HoA 返回一个键。换句话说,应该只为第二个 HoA 中的每个 $key 调用子例程,并根据第一个 HoA 中键的数组的计算返回第一个 HoA 中产生最佳值的 $key。

这就是我现在的方式。假设我有一个名为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 次。我只想为%second_HoA 中的每个$key 调用calculate,这是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 次,这是我想要的,但它会使子例程中的事情复杂化。

任何建议。谢谢。

【问题讨论】:

  • 请贴子程序代码
  • 子程序很长而且很复杂,但我会尝试发布它的最小表示。
  • 好的,我刚刚发布了子程序
  • 这 4 个电话应该是什么?填空:calculate([ '10', '15', '20', '25'], ???), calculate([ '21', '33', '21', '23'], ???), ...
  • 我现在采用第二种方法。这些电话是calculate(['10', '15', '20', '25'], \%first_HoA)calculate([ '21', '33', '21', '23'], \%first_HoA)calculate([ '43', '14', '23', '23'], \%first_HoA)calculate([ '37', '45', '43', '49'], \%first_HoA)

标签: perl hash for-loop reference subroutine


【解决方案1】:

你说calculate($second_HoA{$key}, \%first_HoA)“使事情复杂化”,但我不明白这怎么可能。在我看来,这是您需要的最少信息,而且格式方便。

任何事情都会使事情变得复杂,因为您将无法获得进行计算所需的信息。

【讨论】:

  • 是的,我将尝试这种方法。一旦我进入子程序,我可以尊重哈希%first_HoA,然后我可以遍历哈希的值(数组的元素)并进行计算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
相关资源
最近更新 更多