在变量上成功使用 grep 后,它打印空白

After successfully using grep on a variable it prints blank

我正在打开一个目录,其中包含如下所示的文件。这是一个文件:

    >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";
          }
    }

没有为 $line 打印任何内容,但是这段代码正确地计算了打开文件时出现在文件中的“>”的数量,通过打印 $numberoffastas 证明。
我该如何修复此代码,使 $line = 类似于:

     >EFGHI 

    ABCDEFGHIJKLMNOPQRSTUVWXYZ  

谢谢

my $numberoffastas = grep{/>/}<$fastas>;

在列表上下文中的 $fastas 文件句柄上调用 readline,它会消耗文件句柄上的所有输入。在您随后调用 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>) { ... }