Всегда use strict
и use warnings
в начале вашей программы, особенно когда вы обращаетесь за помощью.Это сэкономит много времени, поскольку вы найдете множество простых ошибок для вас.
Откуда у вас появилась идея использовать typeglobs таким образом?*ARGV
is всегда true, поэтому бесполезно проверять, является ли @ARGV
пустым, и использование *first
в качестве дескриптора файла будет работать, но это очень необычно.Лучше всего использовать лексический дескриптор файла, например,
open my $first, '<', $ARGV[0] or die $!;
Однако нет необходимости явно открывать файл, указанный в качестве параметра: Perl сделает это неявно для вас, если вы прочитаете из нулевого дескриптора файла <>
.
Эта программа, кажется, делает то, что вам нужно.
use strict;
use warnings;
use constant WINDOW => 50;
@ARGV or die "No input file specified";
my ($key, $pos, $start, $size);
while (<>) {
if ( /^>(.+?)\s/ ) {
$key = $1;
$pos = $size = 0;
undef $start;
next;
}
chomp;
for (split //) {
next unless /[ATGC]/;
$start //= $pos;
$size++;
if ($key and $size == WINDOW) {
printf "%-6s %4d %4d\n", $key, $start, $pos + 1;
undef $start;
$size = 0;
}
}
continue {
$pos++;
}
}
вывод
chr1 0 50
chr1 50 100
chr1 100 215
chr1 215 265
chrM 0 50
chrM 50 100
chrM 100 150
chrM 150 200
chrM 200 250