通过在perl中使用索引ref来更改数组元素的值

时间:2014-04-08 11:16:48

标签: perl

 #!/bin/usr/perl -w
 use strict;
 print "Enter your input filename for original  sample data values: \n";
 chomp($data=<STDIN>);
 print "Enter your input filename for adjustment values\n";
 chomp($adj=<STDIN>) ;
 print "Enter your output filename for resultant adjusted new sample data \n";
 chomp($new=<STDIN>);
 open(R1,"$data") or die("error");
 open(R2,"$adj") or die ("error");
 open(WW,"+>$new") or die ("error");
 while( ($line1=(<R1>)) && ($line2=(<R2>)) )
 {
 $l1=$line1;
 @arr1= split(" ",$l1);
 $l2=$line2;
 @arr2= split(" ",$l2);
 $l= ( scalar@arr1); 
 $p= (scalar@arr2);

 for ( $i = 0; $i <= $l; $i++ ){
    for ( $j =($i+1); $j <= $l; $j++ ){

        if ($arr1[$i]< $arr1[$j]){
            $a = $arr1[$i] + ($arr2[$i]/2);
            $b = $arr1[$j] - ($arr2[$i]/2);
            push ( $arr1[$i]->$a , $arr1[$j]->$b);

        }
        elsif ( $arr1[$i]= $arr1[$j]){
            $a = $arr1[$i];
        $b = $arr1[$j];
            push ($arr1[$i]->$a,$arr1[$j]->$b);

        }      
        else{
            $a = $arr1[$i]-($arr2[$i]/2);
        $b = $arr1[$j]+ ($arr2[$i]/2);
        push ($arr1[$i]->$a,$arr1[$j]->$b);

        }
    }

 }
 $l1 = scalar@arr1;
 for ($k = 0; $k <= $l1 ; $k++)
 {
 if (($k % 10) != 0){
    print  WW "$arr1[$k]"; 
    print  WW "\t" ;
}
else {
    print WW "\n";
    print WW "$arr1[$k]";
    print WW "\t";
}

 }


 }
 close(R1);
 close(R2);
 close(WW);


 exit;

当我运行这个编程时。我收到一个错误,“不是第29行的ARRAY引用”。 如何创建对我的第一个数组@arr1的引用???以便在运行迭代后将元素的更改值存储在特定索引处。

输入:

@array1  
1 2 3 4 5 6 7 8 9 10  

@array2  
1 2 3 4 5 6 7 8 9 10 9 8 7 6 5 4 3 2  

期望的输出

@array1  
15 1.5 2 3 6 4 11.5 5 5.5  

1 个答案:

答案 0 :(得分:0)

好吧,我没有得到你说你正在寻找的答案,但你想要做的就是将$ a的价值存入$ i&#39 ;数组@ arr1的索引和$ b的值@ arr1的$ jth索引。我已经从if分支中提取了赋值代码,因为它对于所有三种情况都是相同的。我还修复了你的条件中的一个微妙的错误。你有

elsif ( $arr1[$i]= $arr1[$j]){

但你肯定打算在这里进行相等比较而不是作业:

elsif ( $arr1[$i] == $arr1[$j]){

所以这是修改过的部分。正如我所说,它仍然没有打印出您所说的理想结果,而且我不确定是否因为您的计算错误或打印错误(我无法&#39) ; t找出从输入到所需输出的任何明显变换),但这至少应该让你朝着正确的方向前进:

for ( $i = 0; $i <= $l; $i++ ){
    for ( $j =($i+1); $j <= $l; $j++ ){

        if ($arr1[$i]< $arr1[$j]){
            $a = $arr1[$i] + ($arr2[$i]/2);
            $b = $arr1[$j] - ($arr2[$i]/2);
#            push ( $arr1[$i]->$a , $arr1[$j]->$b);

        }
        elsif ( $arr1[$i] == $arr1[$j]){
            $a = $arr1[$i];
            $b = $arr1[$j];
#            push ($arr1[$i]->$a,$arr1[$j]->$b);

        }      
        else{
            $a = $arr1[$i]-($arr2[$i]/2);
            $b = $arr1[$j]+ ($arr2[$i]/2);
#        push ($arr1[$i]->$a,$arr1[$j]->$b);

        }
        $arr1[$i] = $a;
        $arr1[$j] = $b;
    }

}