perl将哈希数组传递给sub

时间:2013-09-22 15:50:12

标签: perl loops hash arguments infinite

我通过引用子function(\@charts);传递数组 数组图表包含i = 0处的散列数组和i = 1处的字符串,依此类推(hash-string ..) 我想将@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';

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

1 个答案:

答案 0 :(得分: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;

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