将字符串转换为数组 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";
}
}
}
我有一个脚本,它获取 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";
}
}
}