perl将哈希数组传递给sub

Mar*_*iya 1 perl hash arguments loops infinite

我通过引用传递一个数组,function(\@charts); 数组图表包含i = 0的哈希数组和i = 1的字符串等等(哈希字符串..)我想将哈希的键存储在@x和@y中的值如下面的函数所示.但是我得到了一个无限循环;它继续打印...

sub function{
print Dumper @_;

    for ($i=0;$i<scalar @{$_[0]} ;$i+2)
    {
    @data= @{$_[$i]};
    $title=$_[$i+1];
    %hash =%{$data[$i]};
    # print Dumper \%hash;
    foreach my $key (sort { $a <=> $b} keys %hash) {
        push (@x,$key);
        push (@y,$hash{$key});
    }

     print Dumper @x;

    }}
Run Code Online (Sandbox Code Playgroud)

输出:

 $VAR1 = [
   {
     '84' => 2,
     '11' => 2,
     '53' => 2,
     '3' => 2,
     '-46' => 2,
     '14' => 2,
     '-7' => 2,
     '47' => 2,
     '-10' => 2,
     '0' => 2,
     '72' => 2,
     '-2' => 2
   },
   '1_-2_-2'
 ];
Run Code Online (Sandbox Code Playgroud)

这是@x无限循环

 ...$VAR21817 = '-46';
    $VAR21818 = '-10';
    $VAR21819 = '-7';
    $VAR21820 = '-2';
    $VAR21821 = '0';
    $VAR21822 = '3';
    $VAR21823 = '11';
    $VAR21824 = '14';
    $VAR21825 = '47';
    $VAR21826 = '53';
    $VAR21827 = '72';
    $VAR21828 = '84';
    $VAR21829 = '-46';
    $VAR21830 = '-10';
    $VAR21831 = '-7';
    $VAR21832 = '-2';
    $VAR21833 = '0';
    $VAR21834 = '3';
    $VAR21835 = '11';
    $VAR21836 = '14';
    $VAR21837 = '47';
    $VAR21838 = '53';
    $VAR21839 = '72';
    $VAR21840 = '84';
    $VAR21841 = '-46';
    $VAR21842 = '-10';
    $VAR21843 = '-7';
    $VAR21844 = '-2';
    $VAR21845 = '0';
    $VAR21846 = '3';
    $VAR21847 = '11';
    $VAR21848 = '14';
    $VAR21849 = '47';
    $VAR21850 = '53';
    $VAR21851 = '72';
    $VAR21852 = '84';
Run Code Online (Sandbox Code Playgroud)

问题出在哪里以及如何解决?提前致谢

TLP*_*TLP 8

无限循环是因为这条线

for ($i=0;$i<scalar @{$_[0]} ;$i+2)
#                             ^^^^---- here
Run Code Online (Sandbox Code Playgroud)

这是循环增量器,你只是给它一个数字,而不是递增$i.这部分当然应该是$i += 2.

不过,这是一个相当糟糕的设置.我假设\@charts看起来像这样

$VAR1 = [
          {
            'a' => 1,
            'b' => 2
          },
          'foo',
          {
            'y' => 13,
            'x' => 12
          },
          'bar'
        ];
Run Code Online (Sandbox Code Playgroud)

你应该做的是将这些组合在一起

$VAR1 = [
          {
            'title' => 'foo',
            'data' => {
                        'a' => 1,
                        'b' => 2
                      }
          },
          {
            'title' => 'bar',
            'data' => {
                        'y' => 13,
                        'x' => 12
                      }
          }
        ];
Run Code Online (Sandbox Code Playgroud)

这样你就可以直接分配,并使用一个简单的循环

for my $href (@_) {
    my $title = $href->{title};
    my %hash  = %{ $href->{data} };
    ....
}
Run Code Online (Sandbox Code Playgroud)

你还应该添加

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

并在尽可能小的范围内声明变量,例如在子例程中的循环内.