新手求助关于perl--如何打开fsa文件以及提取数据

小弟刚开始学perl,现有一个fasta文件,里面是以若干个序列,例如:
>gi|113195030|gb|EE595366.1|EE595366 EST CCUPAS120LF01a01F Pigeon pea Leaf cDNA Library Cajanus cajan cDNA clone CCUPAS120LF 5', mRNA sequence.
GGGCCCGGATANTTGGGCGGGAATCGAGCCGGCCCCCAGGTTTATGATGTGCGCAGCTG....TGCTCCT
>gi|113195031|gb|EE595367.1|EE595367 EST CCUPAS120LF01a02F Pigeon pea Leaf cDNA Library Cajanus cajan cDNA clone CCUPAS120LF 5', mRNA sequence.
GGGCGATATTGCGGANTGAGCTGGNACCAAGTTTCGACTATCTCAAACTCCGAACGGGTG
GACGGGGGCTTCCCGGCGGACGAAGCC....TTCGACTATC
>gi|113195032|gb|EE595368.1|EE595368 EST CCUPAS120LF01a03F Pigeon pea Leaf cDNA Library Cajanus cajan cDNA clone CCUPAS120LF 5', mRNA sequence.
TCGGGGTCCGTATANGCGAGGATCGAGCCGGTCCCGCCATATATGATAGTTNACTTTTAT
CATTAACTTGA....CACTCAGATCCA
.
.
.
.
现在fsa文件就在C盘根目录下,我要做的就是用perl计算文件中共有多少个序列:
$filename = `sequence.fsa`;
open(FILE, "$filename") || die("Couldn't read file $filename\n");
while (<FILE>){
$seq_num ++;
}
print $seq_num;
close FILE;
我想的是按照一行一行读取文件,然后有多少行就有多少个序列,不知道这个思路对不对;但是运行时总是提醒我有错误无法运行,我看了很多教程讲如何打开文件都是一笔带过,请各位不吝指点!
另外,我还想把gi后面的编号提取出来(例如第一个序列就是提取113195030,第二个是113195031,等等);最后输出到一个新文件中,应该如何写代码呢?
万分感谢!

第1个回答  推荐于2018-04-13
首先,文件名应该用双引号"或单引号'引,而不是反引号`引。
其次,不应该是一行算一个序列吧,应该是遇到顶头的>算一个序列吧。
因此,要统计序列数目:
#!/usr/bin/perl

$filename = "sequence.fsa";
open(FILE, $filename) || die("Couldn't read file $filename\n");
while ($line = <FILE>){
if($line =~ /^>/ ){
$seq_num ++;
}
}
print $seq_num;
close FILE;

要想打印gi后的编号:
#!/usr/bin/perl

$filename = "sequence.fsa";
open(FILE, $filename) || die("Couldn't read file $filename\n");
while ($line = <FILE>){
if($line =~ /^>gi|([0-9]+)/ ){
print ($1 . "\n");
}
}
close FILE;

输出到新文件可以使用命令行重定向符>,例如:perl 程序名.pl >list.txt
或在程序中打开然后写文件,类似 收获者888 的代码:
#!/usr/bin/perl

$filename = "sequence.fsa";
$outname = "list.txt";
open(FILE, $filename) || die("Couldn't read file $filename\n");
open(OUTFILE, $outname) || die("Couldn't open file $outname\n");
while ($line = <FILE>){
if($line =~ /^>gi|([0-9]+)/ ){
print OUTFILE ($1 . "\n");
}
}
close FILE;
close OUTFILE;

以上代码中文件名都是相对路径,即运行时当前目录,需要将那个sequence.fsa拷到当前目录再执行。

另外,如果不能运行,请将出错提示贴上来,便于分析。本回答被提问者和网友采纳
第2个回答  2010-07-26
#!/usr/bin/perl
use FileHandle;
print main();

sub main {
my $fin = new FileHandle;
my $fout = new FileHandle;

open($fout,">/home/xxx/result.txt") or die "can't open out\n";
open($fin,"</home/xxx/sequence.fsa") or die "can't open in\n";
while ($line = <$fin>) {
($g,$id)=split(/\|/,$line);
if ($id) {
print $fout($id."\n");
}
}
close($fin);
close($fout);
}