2013-08-12 2 views
1

У меня есть 2d массив в Perl. Я передал массив подпрограмме, и я хочу изменить все элементы массива 2d, а затем вернуть его и распечатать массив. Я добавил код ниже. Проблема, с которой я столкнулась, фактически изменяет каждый отдельный элемент и передает массив подпрограмме.2d Массив: меняющиеся элементы Perl

Оригинальная матрица + код

 x   y  z 
CG -3.74900 -4.89100 -3.45400 
OD1 -6.45900 -6.29100 -6.08000 
OD2 -1.31600 -1.83300 -0.17600 

sub translateMatrixOperation 
{ 
my (@translatematrix, $x, $y, $z) = @_; 
print "PRINTING FIRST\n"; 
my $arrsize = scalar @translatematrix; 
for(my $i = 0; $i <= $arrsize; $i++) 
{ 
    for(my $j = 0; $j <= $arrsize; $j++) 
    { 
     if ($j == 0) 
     { 
      print "[$i][$j]:$translatematrix[$i][$j]\n"; 
      $_ = $_ - $x; 
     } 
     elsif ($j == 1) 
     { 
      print "[$i][$j]:$translatematrix[$i][$j]\n"; 
      $_ = $_ - $y; 
     } 
     elsif ($j == 2) 
     { 
      print "[$i][$j]:$translatematrix[$i][$j]\n"; 
      $_ = $_ - $z; 
     } 
    } 
} 
print "PRINTING\n"; 
for(my $i = 0; $i <= $arrsize; $i++) 
{ 
    for(my $j = 0; $j <= $arrsize; $j++) 
    { 
     print "$translatematrix[$i][$j] "; 
    } 
    print "\n"; 
} 
# return (\@translatematrix); 

} Я хочу изменить весь массив путем добавления постоянного значения к значениям х, постоянное значение для значений у, а постоянная в г. Где я неправ?

+0

относительно стиля, 'for (my $ i = 0; $ i <= $ arrsize; $ i ++)' обычно записывается как 'для my $ i (0 .. $ # arr)' для '@ arr' array –

+0

Считаете ли вы использование [PDL] (http://pdl.perl.org/)? Должно делать операции с матрицей очень легко. – memowe

ответ

2
my (@translatematrix, $x, $y, $z) = @_; 

не имеет смысла, так как @translatematrix хлебает все элементы из @_, и должно быть:

my ($translatematrix, $x, $y, $z) = @_; 

где $translatematrix является ссылкой на массив.

 $_ = $_ - $x; 

должно быть больше как

$translatematrix->[$i][$j] -= $x; 

, а также аналогичной логики к $y и $z должен быть применен.

+0

Этот метод работает, но это мешает мне использовать текущий метод вычисления длины. Как рассчитать длину массива? – user2657817

+0

@ user2657817 вы можете изменить порядок параметров, т.е. 'my ($ x, $ y, $ z, @translatematrix) = @_;' поэтому массив последний –

Смежные вопросы