我在我的程序中使用散列散列。我想把两个值相加在同一行中。我的散列的例子是:
%data_final = (
2010 => {
Jan => {
group1 => {
Type1 => {
Total1 => 12,
Total2 => 10
},
Type2 => {
Total1 => 17,
Total2 => 14
},
},
},
}
);我想要一大笔Total1和Total2的group1。我所做的工作如下:
$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,但是在"}{“附近有一个语法错误。
非常感谢你的帮助。
发布于 2013-08-08 19:33:10
@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 )};让我们来分析一下常见的部分:
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-08 19:00:58
尝试这段代码,这将起到以下作用:
#!/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-08 19:37:30
在代码中发现了几个问题:
$total1_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total1} );
^ extra } ^ missing /另外,切片返回一个hashrefs列表,您不能直接访问该列表,因此需要将末端的{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/} );https://stackoverflow.com/questions/18133768
复制相似问题