将字符串转换为数组perl



我有一个脚本,它采用多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;

最新更新