切片散列哈希perl

Kar*_*rem 2 perl hash slice multidimensional-array

我在我的程序中使用哈希哈希.我想在同一行中将两个值相加.我的哈希的例子是:

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

我想为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} );
Run Code Online (Sandbox Code Playgroud)

$ total1_sum的输出应为29,$ total2_sum的输出应为24,但我在"} {"附近出现语法错误.

非常感谢你的帮助.

ike*_*ami 5

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

在应用map并修复错位后},您会得到:

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 )};
Run Code Online (Sandbox Code Playgroud)

让我们分解出常见的比特:

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