Mar*_*iya 1 perl hash arguments loops infinite
我通过引用传递一个数组,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;
}}
Run Code Online (Sandbox Code Playgroud)
输出:
$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'
];
Run Code Online (Sandbox Code Playgroud)
...$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';
Run Code Online (Sandbox Code Playgroud)
问题出在哪里以及如何解决?提前致谢
无限循环是因为这条线
for ($i=0;$i<scalar @{$_[0]} ;$i+2)
# ^^^^---- here
Run Code Online (Sandbox Code Playgroud)
这是循环增量器,你只是给它一个数字,而不是递增$i.这部分当然应该是$i += 2.
不过,这是一个相当糟糕的设置.我假设\@charts看起来像这样
$VAR1 = [
{
'a' => 1,
'b' => 2
},
'foo',
{
'y' => 13,
'x' => 12
},
'bar'
];
Run Code Online (Sandbox Code Playgroud)
你应该做的是将这些组合在一起
$VAR1 = [
{
'title' => 'foo',
'data' => {
'a' => 1,
'b' => 2
}
},
{
'title' => 'bar',
'data' => {
'y' => 13,
'x' => 12
}
}
];
Run Code Online (Sandbox Code Playgroud)
这样你就可以直接分配,并使用一个简单的循环
for my $href (@_) {
my $title = $href->{title};
my %hash = %{ $href->{data} };
....
}
Run Code Online (Sandbox Code Playgroud)
你还应该添加
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
并在尽可能小的范围内声明变量,例如在子例程中的循环内.