OK first off: Никогда не «выключайте предупреждения». Вы бы отключили предупреждения на своей машине и ожидали, что это хорошо закончится? Предупреждения есть, потому что нужно что-то исправить, а не игнорировать.
my
используется для объявления переменной при первом ее использовании.
Это так же просто, как
my $newtable = 0;
Вы также добавили несколько путаницы в свой код, и я бы посоветовал вам отсортировать:
- Сделайте отступ правильно
- Не используйте
$newtable
и @newtable
- это разные переменные, и слишком легко смешать $newtable;
и $newtable[0];
- У вас есть
$temp
и $tepm
- это именно то, что use warnings
помогает вам идентифицировать. - Разделение
$filename
для получения @numbertable
- Я уверен, что это не делает то, что вы хотите, потому что это разбивает строку '/home/kgee/Desktop/gene_gangs/table_gangs/table_ony_numbers'
на символы. Возможно, вы имели в виду split /\t/, $row;
? - Аналогично
my @newtable= split//,$newtable;
... Я не думаю, что это делает то, о чем вы думаете, потому что $newtable
это «просто» ноль, как было показано ранее в вашей программе, и вы никогда не модифицируете его. for (@numbertable)
выполняет итерацию каждого элемента в этой таблице (разделенная строка?), Но вы никогда не используете итератор. $_
устанавливается на текущий элемент каждой итерации. Но это не имеет ничего общего с $i
и $j
, и вы на самом деле, кажется, вообще не изменяете $j
- так что оно остается равным нулю. perl -w
и use warnings;
являются избыточными. Вы, вероятно, должны придерживаться одного или другого. (Я поддерживаю use warnings;
вместе с use strict;
лично).
На самом деле, чем больше я смотрю на код, я боюсь, становится ясно, что он на самом деле не работает, и ваши проблемы бежать немного глубже, чем ваши первоначальные предупреждения.
Как насчет:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @previous_row;
my @new_table;
##iterate line by line - use your file handle here, <DATA> is a special case.
while ( <DATA> ) {
#strip trailing linefeed.
chomp;
#split this row on any whitespace (which includes tabs)
my @row = split;
#Handle first iteration - can't subtract 'previous row' if there isn't one.
if ( @previous_row ) {
my @new_row;
#iterate the current row
foreach my $element ( @row ) {
#grab the elements off the previous row - note "shift" modifies it, and this will
#break if you've got uneven length rows. (But you don't, and I'll leave it to you to handle that if you do.
my $previous_row_element = shift @previous_row;
#calculate new value
my $value = abs ( $element - $previous_row_element );
#stash new value into new row.
push @new_row, $value;
}
#new row is complete, so push it into the new table.
push @new_table, \@new_row;
}
#Update 'previous row' with the contents of the current row.
@previous_row = @row;
}
#lazy mode output. Iterating the array and printing values in the format you want
#is up to you.
print Dumper \@new_table;
__DATA__
43 402 51 360 66
61 63 67 66 65
63 60 69 63 58
65 53 89 55 57
103 138 135 135 85