中的因子安全
我想将数据标准化。我写了此代码:
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 "$it$data[$i][0]t$data[$i][1]t$max1t";
$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$max1n";
}
然而,这产生了一个错误:最高位置的所有值都除以最大值,而最大位置后的值则不变,好像"/$ data [$ max1] [1] * 10000从未发生过。
但是,如果我使用值而不是通过数组位置更改比较,我得到了正确的结果:
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 "$it$data[$i][0]t$data[$i][1]t$max1t";
#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$max1n";
}
我对代码的第一位做了什么?
原始代码的问题是,通过修改数组的一部分,$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