我通过引用子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'
];
...$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';
问题出在哪里以及如何解决? 提前致谢
答案 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;
并在尽可能小的范围内声明变量,例如在子程序中的循环内。