После успешного использования 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>) { ... }