切分散列的perl
我正在我的程序中使用散列。我想在同一行中求两个值的和。 我的哈希的示例是:切分散列的perl,perl,multidimensional-array,slice,hash,Perl,Multidimensional Array,Slice,Hash,我正在我的程序中使用散列。我想在同一行中求两个值的和。 我的哈希的示例是: %data_final = ( 2010 => { Jan => { group1 => { Type1 => { Total1 => 12, Total2 => 10 }, Type2 => {
%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_和$total2_和的输出应分别为29和24,
但是我在“}{”附近发现了一个语法错误
非常感谢您的帮助。请尝试以下代码,这将实现以下目的:
#!/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
@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;
在代码中发现几个问题:
$total1_sum = sum( @{$data_final}{2010}{Jan}{group1}}{qw/Type1 Type2}{Total1} );
^ extra } ^ missing /
另外,切片返回一个hashref列表,您无法直接访问该列表,因此末尾的{Total1}
部分需要更改为映射(或循环)
最终更正代码:
$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/} );
多个问题
您缺少qw的终止符(您需要{qw/type1type2/}
)。我想那部分只是疏忽
$data\U final之后不应出现}。例如,如果您只想获取2010键的值,那么它将是$data\u final{2010}
,而不是{$data\u final}{2010}
。然后,要获取该值中包含的哈希中的键的值,请在该值上附加另一个下标:$data\u final{2010}{Jan}
…依此类推。因此,您的哈希片应该是@{$data_final{2010}{Jan}{group1}{qw/Type1 Type2/}
哈希片返回一个数组,正如@所暗示的(实际上是必需的)。这个特定散列片返回的数组确实包含散列,但您不能只将散列下标添加到散列数组中,以获得每个散列中对应键的值的数组。例如,如果您有一个包含哈希的数组@harray,@harray{mykey}
将不会返回每个哈希中mykey值的数组。但这正是您试图对结尾处的{Total1}
和{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};
}
$$是去引用,因为数组的元素实际上是散列引用。这是散列的散列。也许是时候重新考虑您的数据结构了。非常感谢,它很有效。另一个答案更符合我编写大程序的方式。使用Excel::Writer::XLSX;
foreach (@{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/}) {
$total1_sum += $$_{Total1};
}
foreach (@{$data_final{2010}{Jan}{group1}}{qw/Type1 Type2/}) {
$total2_sum += $$_{Total2};
}