将字符串转换为数组 perl

Convert string into array perl

我有一个脚本,它获取 multi-fasta 文件的 headers 并将它们推送到一个数组中。然后我想遍历这个数组来找到一个特定的模式并执行一些命令。

open(FH, '<', $ref_seq) or die $!;
while(<FH>){

    $line = $_;
    chomp $line;
    if(m/^>([^\s]+)/){
        $ref_header = ;
        print "$ref_header\n";
        chomp $header;
        if( eq $header){
            $ref_header = $header;
            #print "header is $ref_header\n";
        } 
    } 
}

此代码打印 headers 喜欢

chr1
chr2
chr3

如何将这些 headers 推入数组?

我试过下面的代码,但它拆分了单个字母,而不是 $header_array[0]chr1

@header_array = split(/\n*/, $ref_header);
            print ("Here's the first element $header_array[0]");

任何帮助将不胜感激。

您可以使用 push:

push @header_array, $ref_header;

如下所示缩短代码,删除一些多余的语句,并使用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 = ;
        print "$ref_header\n";
        # 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( eq $header){
            $ref_header = $header;
            #print "header is $ref_header\n";
        } 
    } 
}