2016-02-07 2 views
0

У меня есть пять файлов fasta в каталоге, которые я могу успешно разместить в массиве. Когда я пытаюсь открыть все файлы подряд через цикл foreach, для выполнения регулярного выражения для каждого файла, только первый файл в каталоге, похоже, открывается для обработки. Кроме того, когда я пытаюсь напечатать всю последовательность в первом файле (с помощью диагностического отчета о печати, который не показан), первая половина последовательности игнорируется. Печатается только последняя часть последовательности. Если кто-нибудь узнает о том, как преодолеть это, я был бы очень благодарен. Вот как выглядит мой код до сих пор.Цикл Foreach действует только на часть первого элемента в массиве

#!/usr/bin/perl 
use warnings; 
use strict; 
use diagnostics; 

my $dir = ("/Users/roblogan/Documents/FakeFastaFilesAgain"); 
my @TrimmedSequences; 

my @ArrayofFiles = glob "$dir/*"; 

#print join("\n", @ArrayofFiles), "\n";  # this is a diagnostic test print statement 

foreach my $file (@ArrayofFiles){ 
    open (my $sequence, '<', $file) or die $!; # open each file in the array 
    while (my $line = <$sequence>) { 
     $line =~ s/\R//g;       # get rid of new line breaks 
     if ($line =~ m/(CTCCCA)[TAGC]+(TCAGGA)/) { # search file contents 
      push(@TrimmedSequences, $line);  # push the match into another array 
      close $file; 
     } 
    } 
} 

print join("\n", @TrimmedSequences), "\n"; 
+0

'close $ file' не будет работать. – Sobrique

ответ

0

Вы вызываете близко от неправильной переменной $file (имя файла, строка) вместо $sequence (указатель_на_файл файла).

Кроме того, вызов close не в том месте, вы закрываете дескриптор файла в середине цикла чтения. Если вы действительно намеревались найти только первую совпадающую строку в каждом файле, закройте дескриптор файла и перерыв (last) из цикла while. Если вы хотите найти все соответствующие строки во всех файлах:

foreach my $file (@ArrayofFiles){ 
    open (my $sequence, '<', $file) or die $!; 
    while (my $line = <$sequence>) { 
     $line =~ s/\R//g; 
     if ($line =~ m/(CTCCCA)[TAGC]+(TCAGGA)/) { 
      push(@TrimmedSequences, $line); 
     } 
    } 
    close $sequence or die $!; 
} 
+0

К сожалению, даже после экспериментов со всеми вашими ответами я все еще могу читать, работать и печатать один файл из каталога файлов. По крайней мере, я должен был бы добавить все содержимое файлов по очереди в массив и затем распечатать их. Игра с закрытым заявлением не помогла. Как минимум следующий код должен быть функциональным, но не является: foreach my $ file (@ArrayofFiles) {open (my $ sequence, '<', $ file) или die $ !; while (my $ line = <$sequence>) {chomp ($ line); push (@TrimmedSequences, $ line); }} print @trimmedSequences, "\ n"; – Rob

+0

@Rob попробуйте сделать скрипт с минимальным количеством кода, необходимым для печати всех строк из одного из файлов. Похоже, что это не так много проблем с этим блоком кода, возможно, в вашем коде есть что-то в другом месте, или что-то общее с файлами, которые вы пытаетесь проанализировать – Gabs00

1

Тестирование вашего кода (или аналогичного ему) отлично работает при удалении оператора close. Использование close breaks цикл, как только он находит совпадение. Оставляя только один результат в файле.

Также обратите внимание: вам не нужно вообще звонить близко. Файл будет закрыт, когда переменная $ sequence потеряет область.

chomp следует использовать, чтобы избавиться от

переводов строк

Вот мой тестовый код. обратите внимание на несколько изменений.

#!/usr/bin/perl 

use strict; 
use warnings; 

my $files = ("."); 

my @files = grep { $_ =~ /\.pl/} glob "$files/*"; #added to filter out the directies in test directory, can be ignored 
my @lines; 

#use for in perl not foreach 
for my $file (@files){ 
    open my $fh, '<', $file or die $!; 
    while(my $line = <$fh>){ 
    chomp($line); #Use chomp to remove newlines 
    if($line =~ /use/){ 
     push @lines, $line; #no need to call close at all, the filehandle is closed when it loses scope 
    } 
    } 
} 

print join("\n", @lines) . "\n"; 

Как и ожидалось в моем тестовом каталоге и печатает все операторы использования из файлов perl, которые у меня есть в каталоге.

Смежные вопросы