在变量上成功使用 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>) { ... }
我正在打开一个目录,其中包含如下所示的文件。这是一个文件:
>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>) { ... }