我有一个脚本,它采用多fasta文件的头并将它们推入数组。然后我想循环遍历这个数组来找到一个特定的模式并执行一些命令。
open(FH, '<', $ref_seq) or die $!;
while(<FH>){
$line = $_;
chomp $line;
if(m/^>([^s]+)/){
$ref_header = $1;
print "$ref_headern";
chomp $header;
if($1 eq $header){
$ref_header = $header;
#print "header is $ref_headern";
}
}
}
这段代码打印像
这样的头chr1
chr2
chr3
我怎么把这些头推到一个数组?
我尝试遵循代码,但它分割单个字母,而不是$header_array[0]
是chr1
@header_array = split(/n*/, $ref_header);
print ("Here's the first element $header_array[0]");
任何帮助都将不胜感激。
缩短代码如下所示,删除一些额外的语句,并使用push
。您可以组合push
和模式匹配:
#!/usr/bin/env perl
use strict;
use warnings;
use Carp;
my $in_file = shift;
my @headers;
open my $in_fh, '<', $in_file or croak "cannot open $in_file: $!";
while ( <$in_fh> ) {
push @headers, />(S+)/;
}
close $in_fh or croak "cannot close $in_file: $!";
print "@headers";
# Now, loop through headers and select the ones you need, for example:
for my $header ( @headers ) {
if ( $header =~ /foo/ ) {
# do something
}
}
修复原始代码的一些建议如下:
# Always use strict and use warnings.
# Remove extra parens and make the error message more informative:
open(FH, '<', $ref_seq) or die $!;
while(<FH>){
$line = $_;
chomp $line;
# [^s] is simply S:
if(m/^>([^s]+)/){
$ref_header = $1;
print "$ref_headern";
# where is $header coming from?
chomp $header;
# if the condition is satisfied, this assignment does not make sense:
# $ref_header is already the same as $header:
if($1 eq $header){
$ref_header = $header;
#print "header is $ref_headern";
}
}
}
可以使用push:
push @header_array, $ref_header;