我正在尝试从这个 FASTA 文件中提取一个 DNA 序列到每行指定长度的碱基,比如 40。
> sample dna (This is a typical fasta header.)
agatggcggcgctgaggggtcttgggggctctaggccggccacctactgg
tttgcagcggagacgacgcatggggcctgcgcaataggagtacgctgcct
gggaggcgtgactagaagcggaagtagttgtgggcgcctttgcaaccgcc
tgggacgccgccgagtggtctgtgcaggttcgcgggtcgctggcgggggt
使用此 Perl 模块 (fasta.pm):
package fasta;
use strict;
sub read_fasta ($filename) {
my $filename = @_;
open (my $FH_IN, "<", $filename) or die "Can't open file: $filename $!";
my @lines = <$FH_IN>;
chomp @lines;
return @lines;
}
sub read_seq (@lines) {
my $linesRef = @_;
my @lines = @{$linesRef};
my @seq;
foreach my $line (@lines) {
if ($line!~ /^>/) {
print "$linen";
push (@seq, $line);
}
}
return @seq;
}
sub print_seq_40 (@seq) {
my $linesRef = @_;
my @lines = @{$linesRef};
my $seq;
foreach my $line (@lines) {
$seq = $seq.$line;
}
my $i= 0;
my $seq_line;
while (($i+1)*40 < length ($seq)) {
my $seq_line = substr ($seq, $i*40, 40);
print "$seq_linen";
$i++;
}
$seq_line = substr ($seq, $i*40);
print "$seq_linen";
}
1;
主剧本是
use strict;
use warnings;
use fasta;
print "What is your filename: ";
my $filename = <STDIN>;
chomp $filename;
my @lines = read_fasta ($filename);
my @seq = read_seq (@lines);
print_seq_40 (@seq);
exit;
这是我得到的错误
Undefined subroutine &main::read_fasta called at q2.pl line 13, <STDIN> line 1.
谁能启发我做错了哪一部分?
看起来你对此一无所获。
我认为你选择使用模块和子例程有点奇怪,因为你只调用每个子例程一次,而且实际上对应于很少的代码。
你的程序和模块都需要从use strict
和use warnings
开始,你不能在Perl子例程中使用这样的原型。包括许多其他错误,这更接近您需要的代码。
package Fasta;
use strict;
use warnings;
use 5.010;
use autodie;
use base 'Exporter';
our @EXPORT = qw/ read_fasta read_seq print_seq_40 /;
sub read_fasta {
my ($filename) = @_;
open my $fh_in, '<', $filename;
chomp(my @lines = <$fh_in>);
@lines;
}
sub read_seq {
my ($lines_ref) = $_[0];
grep { not /^>/ } @$lines_ref;
}
sub print_seq_40 {
my ($lines_ref) = @_;
print "$_n" for unpack '(A40)*', join '', @$lines_ref;
}
1;
q2.pl
use strict;
use warnings;
use Fasta qw/ read_fasta read_seq print_seq_40 /;
print "What is your filename: ";
my $filename = <STDIN>;
chomp $filename;
my @lines = read_fasta($filename);
my @seq = read_seq(@lines);
print_seq_40(@seq);
您需要:
-
添加到您的模块:
use Exporter; our @EXPORT = qw ( read_fasta read_seq ); #etc.
-
显式调用远程模块中的代码:
fasta::read_fasta();
-
显式导入模块子:
use fasta qw ( read_fasta );
另外:模块的一般约定是模块名称的第一个字母大写。
在Perl中,如果你use fasta;
,这不会自动将其所有方法导出到程序的命名空间中。改为呼叫fasta::read_fasta。
或者:使用导出器自动导出方法或启用类似 use Fasta qw/read_fasta/
.
例如:
package Fasta;
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw/read_fasta read_seq read_seq40/;
要使用:
use Fasta qw/read_fasta read_seq read_seq40/;
您还可以使 Fasta 自动导出所有方法或定义关键字以对方法进行分组,尽管后者过去给我带来了一些问题,只有当您确定值得麻烦时,我才会推荐它。
如果要使所有方法都可用:
package Fasta;
use Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw/read_fasta read_seq read_seq40/;
注意 @EXPORT不是@EXPORT_OK。后者允许稍后导入它们(就像我所做的那样),前者会自动导出所有内容。我链接到的文档清楚地表明了这一点。
我只是注意到了别的东西。您正在将 @_ 展平为read_fasta中的$filename。我不确定这是否有效。试试这个:
sub read_fasta {
my $filename = $_[0]; # or ($filename) = @_; @_ is an array. $filename not.
}
解释这个问题:$filename = @_;
的意思是:将@_(数组)存储到$filename(标量)中。Perl 是这样做的:ARRAY 长度存储在 $filename 中。这不是你想要的。您需要数组的第一个元素。那将是 $_[0]。
添加了可能需要的@ISA或使用Borodir的评论。