首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >散列散列切片

散列散列切片
EN

Stack Overflow用户
提问于 2013-08-08 18:48:14
回答 4查看 285关注 0票数 2

我在我的程序中使用散列散列。我想把两个值相加在同一行中。我的散列的例子是:

代码语言:javascript
复制
%data_final = (
   2010 => { 
      Jan => {
        group1 => {
           Type1 => {
              Total1 => 12,
              Total2 => 10
           },
           Type2 => {
              Total1 => 17,
              Total2 => 14
           },
       },
     },
   }
);

我想要一大笔Total1和Total2的group1。我所做的工作如下:

代码语言:javascript
复制
$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,但是在"}{“附近有一个语法错误。

非常感谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-08 19:33:10

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

在应用map并修复错误的}之后,您可以得到:

代码语言:javascript
复制
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 )};

让我们来分析一下常见的部分:

代码语言:javascript
复制
my @results = @{ $data_final{2010}{Jan}{group1} }{qw( Type1 Type2 )};
my $total1_sum = sum map $_->{Total1}, @results;
my $total2_sum = sum map $_->{Total2}, @results;
票数 5
EN

Stack Overflow用户

发布于 2013-08-08 19:00:58

尝试这段代码,这将起到以下作用:

代码语言:javascript
复制
#!/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

输出

代码语言:javascript
复制
total1_sum=29
total2_sum=24
票数 2
EN

Stack Overflow用户

发布于 2013-08-08 19:37:30

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

代码语言:javascript
复制
$total1_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total1} );
                                ^ extra }                           ^ missing /

另外,切片返回一个hashrefs列表,您不能直接访问该列表,因此需要将末端的{Total1}部件更改为map (或循环)。

最终修正代码:

代码语言:javascript
复制
$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/} );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18133768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档