2

我在我的程序上使用哈希值。我想在同一行中对两个值求和。我的哈希示例是:

%data_final = (
   2010 => { 
      Jan => {
        group1 => {
           Type1 => {
              Total1 => 12,
              Total2 => 10
           },
           Type2 => {
              Total1 => 17,
              Total2 => 14
           },
       },
     },
   }
);

我想为 group1 提供一个 Total1 和 Total2 的总计。我正在执行以下操作:

$total1_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total1} );
$total2_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total2} );

$total1_sum 的输出应该是 29,$total2_sum 应该是 24,但在“}{”附近出现语法错误。

非常感谢你的帮助。

4

4 回答 4

5

@h{@k}{Total1}没有意义。您的意思是遍历切片返回的每个引用并获取所引用哈希的元素的值,但是您忽略了使用任何形式的循环。map这里很方便。

应用map并修复您的 misplaced后},您将获得:

my $total1_sum = sum map $_->{Total1},
   @{ $data_final{2010}{Jan}{group1} }{qw( Type1 Type2 )};
my $total2_sum = sum map $_->{Total2},
   @{ $data_final{2010}{Jan}{group1} }{qw( Type1 Type2 )};

让我们分解出常见的位:

my @results = @{ $data_final{2010}{Jan}{group1} }{qw( Type1 Type2 )};
my $total1_sum = sum map $_->{Total1}, @results;
my $total2_sum = sum map $_->{Total2}, @results;
于 2013-08-08T19:33:10.953 回答
2

试试这段代码,就可以了:

#!/usr/bin/perl  

use strict; use warnings;  

my %data_final = (
   2010 => {
      Jan => {
        group1 => {
           Type1 => {
              Total1 => 12,
              Total2 => 10
           },
           Type2 => {
              Total1 => 17,
              Total2 => 14
           },
       },
     },
   }
);

my $total1_sum;
$total1_sum += $data_final{2010}{Jan}{group1}{$_}{Total1}
    for keys $data_final{2010}{Jan}{group1};

my $total2_sum;
$total2_sum += $data_final{2010}{Jan}{group1}{$_}{Total2}
    for keys $data_final{2010}{Jan}{group1};

print <<EOF;
total1_sum=$total1_sum
total2_sum=$total2_sum
EOF

输出

total1_sum=29
total2_sum=24
于 2013-08-08T19:00:58.913 回答
1

在您的代码中发现了几个问题:

$total1_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total1} );
                                ^ extra }                           ^ missing /

此外,切片返回一个哈希引用列表,您无法直接访问该列表,因此{Total1}需要将最后的部分更改为一个map(或循环)。

最终更正的代码:

$total1_sum = sum( map { $_->{Total1} } @{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/} );
$total2_sum = sum( map { $_->{Total2} } @{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/} );
于 2013-08-08T19:37:30.147 回答
0

多个问题。

  1. 您缺少qw的终止符(您需要{qw/Type1 Type2/})。我认为那部分只是一个疏忽。
  2. $data_final之后不应该有}。例如,如果您只想获取 2010 键的值,它会是,而不是。然后,要获取包含在该值中的哈希中的键的值,请在其上添加另一个下标:...等等。所以,你的哈希片应该是.$data_final{2010}{$data_final}{2010}$data_final{2010}{Jan}@{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/}
  3. 哈希切片返回一个数组,正如@所暗示的(实际上是必需的) 。此特定哈希切片返回的数组确实包含哈希,但您不能仅将哈希下标附加到哈希数组以获取每个哈希中相应键的值的数组。例如,如果您有一个包含散列的数组@harray@harray{mykey}则不会在每个散列中返回mykey值的数组。但这就是你试图用{Total1}and{Total2}最后做的事情。因此,您需要做的是遍历散列切片并对给定键的值求和。

可能有更紧凑的方法可以做到这一点,但这有效:

foreach (@{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/}) {
  $total1_sum += $$_{Total1};
}
foreach (@{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/}) {
  $total2_sum += $$_{Total2};
}

$$是取消引用,因为数组的元素实际上是哈希引用。

于 2013-08-08T19:41:39.423 回答