Заполните массив, разделив строку - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь преобразовать строку в массив на основе разделителя пробелов.

Мой входной файл выглядит следующим образом:

>Reference
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnctcACCATGGTGTCGACTC
TTCTATGGAAACAGCGTGGATGGCGTCTCCAGGCGATCTGACGGTTCACTAAACGAGCTC

Игнорирование строки, начинающейся с >,длина остальной части строки - 360.

Я пытаюсь преобразовать это в массив.

Вот мой код:

#!/usr/bin/perl

use strict;
use warnings;

#### To to change bases with less than 10X coverage to N #####

#### Take depth file and consensus fasta file as input arguments ####

my ($in2) = @ARGV;

my $args = $#ARGV + 1;

if ( $args != 1 ) {
    print "Error!!! Insufficient Number of Argumrnts\n";
    print "Usage: $0 <consensus fasta file> \n";
}

#### Open a filehandle to read in consensus fasta file ####

    my $FH2;
    my $line;
    my @consensus;
    my $char;

    open($FH2, '<', $in2) || die "Could not open file $in2\n";

    while ( <$FH2> ) {
        $line = $_;
        chomp $line;
        next if $line =~ />/; # skip header line 
        $line =~ s/\s+//g;

        my $len = length($line);
        print "$len\n";
        #print "$line";

        @consensus = split(// , $line);
        print "$#consensus\n";
        #print "@consensus\n";

        #for $char (0 .. $#consensus){
    #   print "$char: $consensus[$char]\n";
     #   }
    }

Проблема в том, что$len переменная возвращает значение 60 вместо 360, а $#consensus возвращает значение 59 вместо 360, что является длиной строки.

Я удалил пробел после каждой строки с кодом $line =~ s/\s+//g; но он все еще не работает.

1 Ответ

0 голосов
/ 07 июня 2018

Похоже, ваш код по сути работает.Это просто ваша логика проверки, которая не имеет смысла.Я бы сделал следующее:

use strict;
use warnings;

if (@ARGV != 1) {
    print STDERR "Usage: $0 <consensus fasta file>\n";
    exit 1;
}

open my $fh, '<', $ARGV[0] or die "$0: cannot open $ARGV[0]: $!\n";

my @consensus;
while (my $line = readline $fh) {
    next if $line =~ /^>/;

    $line =~ s/\s+//g;
    push @consensus, split //, $line;
}

print "N = ", scalar @consensus, "\n";

Основные примечания:

  • Сообщения об ошибках должны идти в STDERR, а не STDOUT.
  • Если возникает ошибка, программа должна завершиться с кодом ошибки, а не продолжать работу.
  • Сообщения об ошибках должны содержать название программы и причину ошибки.
  • chomp isизбыточно, если вы все равно собираетесь удалить все пробелы.
  • Поскольку вы обрабатываете входные данные построчно, вы можете просто продолжать толкать элементы до конца @consensus.В конце цикла будут собраны все символы во всех строках.
  • Изучение @consensus в цикле не имеет особого смысла, так как он еще не закончил построение.Только после цикла у нас есть все интересующие нас символы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...