我想规范化我的数据。我写了这段代码:
my $max1=0;
for (my $i=0; $i<=$#data; $i++) {
if ($data[$i][1]>$data[$max1][1]) {$max1=$i;}
#Disabled# if ($data[$i][1]>$max1) {$max1=$data[$i][1];}
}
for (my $i=0; $i<=$#data; $i++) {
print "$i\t$data[$i][0]\t$data[$i][1]\t$max1\t";
$data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000;
#Disabled# $data[$i][1] = $data[$i][1] / $max1 * 10000;
print "$data[$i][0]\t$data[$i][1]\t$max1\n";
}
然而,这会产生错误:所有直到最大位置的值都除以最大值,而最大位置之后的值则不变,就像&#34; / $ data [$ max1] [1] * 10000&#34;从未发生过。
但是,如果我使用值而不是数组位置更改比较,我得到了正确的结果:
my $max1=0;
for (my $i=0; $i<=$#data; $i++) {
#Disabled# if ($data[$i][1]>$data[$max1][1]) {$max1=$i;}
if ($data[$i][1]>$max1) {$max1=$data[$i][1];}
}
for (my $i=0; $i<=$#data; $i++) {
print "$i\t$data[$i][0]\t$data[$i][1]\t$max1\t";
#Disabled# $data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000;
$data[$i][1] = $data[$i][1] / $max1 * 10000;
print "$data[$i][0]\t$data[$i][1]\t$max1\n";
}
我对第一段代码做错了什么?
答案 0 :(得分:3)
原始代码的问题在于,在修改数组的过程中,$i
的值将等于$max1
。这意味着statememt
$data[$i][1] = $data[$i][1] / $data[$max1][1] * 10000
将等同于
$data[$max1][1] = $data[$max1][1] / $data[$max1][1] * 10000
将$data[$i][1]
设置为10,000。此后,你正在做
$data[$i][1] = $data[$i][1] / 10000 * 10000
使值保持不变
如果需要,解决方案是在循环之前将最大值提取到单独的变量中,以防止修改
my $maxval = $data[$i][1]
并将作业更改为
$data[$i][1] = $data[$i][1] / $maxval * 10000
您的第二次尝试正常运行,因为它正是这样做,在$max1