После успешного использования grep для переменной он печатает пустое

Я открываю каталог, в котором есть файлы, которые выглядят следующим образом. Вот один файл:

    >UVWXY
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    >STUVW
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    >QRSTU
    ABCDEFGHIJKLMNOPQRSTUVWXYZ 

Вот второй файл:

   >EFGHI
   ABCDEFGHIJKLMNOPQRSTUVWXYZ 

Вот мой код:

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

   my ($directory) = @ARGV;
   my $dir = "$directory";
   my @ArrayofFiles = glob "$dir/*";

   open(OUT, ">", "/path/to/output.txt") or die $!;

   foreach my $file(@ArrayofFiles){
          open(my $fastas, $file) or die $!;
          my $numberoffastas = grep{/>/}<$fastas>;
          #print $numberoffastas, "\n"; 
          while (my $line = <$fastas>){
                 print $line, "\n";
          }
    }

Для строки $ ничего не распечатывается, но этот код правильно подсчитывает количество символов ">", которые появляются в файле при его открытии, о чем свидетельствует печать $numberoffastas.
Как я могу исправить этот код так, чтобы $line = что-то вроде:

     >EFGHI 

или же

    ABCDEFGHIJKLMNOPQRSTUVWXYZ  

Спасибо

1 ответ

Решение
my $numberoffastas = grep{/>/}<$fastas>;

звонки readline на $fastas файловый дескриптор в контексте списка, который потребляет весь ввод файлового дескриптора. При последующем звонке while (my $line = <$fastas>) в этом дескрипторе файла больше нет входных данных, и while условие не выполняется.

Сохраните входные данные в массиве и выполните обе операции над массивом.

my @inp = <$fastas>;
my $numberoffastas = grep {/>/} @inp;
...
foreach my $line (@inp) {
   ...
}

или если вы беспокоитесь о том, что файлы слишком велики и вызывают головную боль, откройте файл

my $numberoffastas = grep {/>/} <$fastas>;
close $fastas;
open $fastas, $file;
...
while (my $line = <$fastas>) { ... }

или же seek в начало файла

open my $fastas, '+<', $file;    #   +<  means random-access mode
my $numberoffastas = grep {/>/} <$fastas>;
...
seek $fastas, 0, 0;              #   rewind to beginning of file
while (my $line = <$fastas>) { ... }
Другие вопросы по тегам