1

我通过引用一个子数组来传递一个数组,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;

    }}

输出:

 $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'
 ];

这是@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';

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

4

1 回答 1

8

无限循环是因为这条线

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

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

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

$VAR1 = [
          {
            'a' => 1,
            'b' => 2
          },
          'foo',
          {
            'y' => 13,
            'x' => 12
          },
          'bar'
        ];

你应该做的是保持集合在一起

$VAR1 = [
          {
            'title' => 'foo',
            'data' => {
                        'a' => 1,
                        'b' => 2
                      }
          },
          {
            'title' => 'bar',
            'data' => {
                        'y' => 13,
                        'x' => 12
                      }
          }
        ];

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

for my $href (@_) {
    my $title = $href->{title};
    my %hash  = %{ $href->{data} };
    ....
}

您还应该添加

use strict;
use warnings;

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

于 2013-09-22T16:03:09.407 回答