我正在打开一个包含如下所示文件的目录。这是一个文件:
>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
由于
答案 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>) { ... }