【问题标题】:perl passing array of hashes to a subperl 将哈希数组传递给子
【发布时间】:2013-09-27 13:11:03
【问题描述】:

我通过引用子 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';

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

【问题讨论】:

    标签: perl loops hash arguments infinite


    【解决方案1】:

    无限循环是因为这条线

    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;
    

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

    【讨论】:

    • 感谢您的回答,我更改了您所写的设置,但是在尝试访问 $title 和 %hash 时出现此错误“不是哈希引用”
    • 这意味着您没有发送哈希引用。
    • 其实我是这样发送的 function(\@charts);转储程序就像 [{{},{},{}}]。当我删除“\”并且转储程序给出 {{},{},{}} 时,事情就解决了。虽然我不知道为什么所有这些混乱。非常感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 2011-02-01
    • 2017-01-18
    • 1970-01-01
    • 2017-02-19
    • 2023-03-28
    • 2020-06-14
    相关资源
    最近更新 更多