Сплит файл Perl - PullRequest
       11

Сплит файл Perl

0 голосов
/ 10 октября 2018

Я хочу разделить части файла.Вот как выглядит начало файла (оно продолжается таким же образом):

Location    Strand  Length    PID      Gene 
1..822        +      273    292571599  CDS001
906..1298     +      130    292571600   trxA

Я хочу разбить столбец Location и вычесть 822-1, сделать то же самое для каждой строки и добавить их всевсе вместе.Так что для этих двух результатов значение будет: (822-1) + 1298-906) = 1213 Как?Мой код прямо сейчас (я не получаю никакого вывода вообще в терминале, он просто продолжает обрабатываться вечно):

use warnings;
use strict;


my $infile = $ARGV[0];             # Reading infile argument
open my $IN, '<', $infile or die "Could not open $infile: $!, $?";

my $line2 = <$IN>;


my $coding = 0;                   # Initialize coding variable
while(my $line = $line2){          # reading the file line by line
    # TODO Use split and do the calculations
     my @row = split(/\.\./, $line);
     my @row2 = split(/\D/, $row[1]);

     $coding += $row2[0]- $row[0];

}

print "total amount of protein coding DNA: $coding\n";

Итак, что я получу из своего кода, если я поставлю:

print "$coding \n";

в конце цикла while, чтобы проверить это:

821 
1642

Итак, первое число верное (822-1), но следующее число не имеет никакого смысла длямне, это должно быть (1298-906).То, что я хочу в конце вне цикла:

print "total amount of protein coding DNA: $coding\n";

- это сумма всех вычитаний каждой строки, т.е. 1213. Но я ничего не получаю, только терминал, который работает вечно.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Явное открытие файла делает ваш код более сложным, чем нужно.Perl автоматически откроет все файлы, переданные в командной строке, и позволит вам читать из них, используя пустой оператор ввода файлов, <>.Таким образом, ваш код становится таким простым:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my $total;

while (<>) {
  my ($min, $max) = /(\d+)\.\.(\d+)/;

  next unless $min and $max;

  $total += $max - $min;
}

say $total;

Если этот код находится в файле с именем adder, а ваши входные данные находятся в add.dat, то вы запускаете его так:

$ adder add.dat
1213

Обновление: И, чтобы объяснить, где вы шли не так ...

Вы когда-либо читали только одну строку из вашего файла:

my $line2 = <$IN>;

И затем вы постоянно присваиваете то же значение другой переменной:

while(my $line = $line2){          # reading the file line by line

Комментарий в этой строке неправильный.Я не уверен, откуда вы взяли эту строку.

Чтобы исправить ваш код, просто удалите строку my $line2 = <$IN> и замените ваш цикл на:

while (my $line = <$IN>) {
  # your code here
}
0 голосов
/ 10 октября 2018

Как однострочный:

perl -nE '$c += $2 - $1 if /^(\d+)\.\.(\d+)/; END { say $c }' input.txt

(Извлечение важной части этого и вставка в ваш реальный сценарий должно быть легко понять).

...