我想分割文件的一部分。这是文件开头的样子(以相同的方式继续):
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。但是我什么也没得到,只是一个永远有效的终端。
答案 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
}