0

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

    >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  

谢谢

4

1 回答 1

2
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>) { ... }
于 2016-07-22T21:30:31.620 回答