Perl:通过比较值与数组位置,找到最大值然后除以最大值

时间:2017-03-07 09:03:54

标签: perl multidimensional-array max

我想规范化我的数据。我写了这段代码:

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";
}

我对第一段代码做错了什么?

1 个答案:

答案 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

中保持因子安全