Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
切分散列的perl_Perl_Multidimensional Array_Slice_Hash - Fatal编程技术网

切分散列的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};
    }