分割档案Perl

时间:2018-10-10 08:53:21

标签: perl split

我想分割文件的一部分。这是文件开头的样子(以相同的方式继续):

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

我想在“位置”列中拆分并减去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 :(得分:2)

单线:

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

(提取其中的重要部分并将其放入实际脚本中应该很容易找出来。)

答案 1 :(得分:0)

显式打开文件会使您的代码复杂得多。 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
}