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

时间:2016-07-22 21:23:48

标签: perl while-loop scalar-context

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

    >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没有打印出任何内容,但此代码正确计算打开时文件中出现的&#34;&gt;&#34;的数量,通过打印$ numberoffastas来证明。
如何修复此代码,以便$ line =类似:

     >EFGHI 

    ABCDEFGHIJKLMNOPQRSTUVWXYZ  

由于

1 个答案:

答案 0 :(得分: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>) { ... }