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 に答える