这是SeqIO.pm
package SeqIO;
use strict;
use Carp;
use warnings;
use vars('@ISA');
use vars('@EXPORT_OK');
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(readSeq writeSeq);
sub readSeq {
my ($var1)= @_;
print "$var1\n";
open IN, '<$var1' or die "Cannot open file : $!";
while(<IN>) {
chomp $_;
print "$_\n";
}
close IN
}
sub writeSeq {}
sub new {
my $this = {};
bless $this;
return $this;
}
1;
Test.pl调用SeqIO.pm
use strict;
use SeqIO;
use warnings;
my $path_fasta=q/D:\360Downloads\A1.fasta/;
my $seqio = new SeqIO;
$seqio->readSeq($path_fasta);
但是当我使用readSeq它显示SeqIO = HASH(0x38ba34)时,有什么不对吗?
答案 0 :(得分:4)
当您使用->
运算符调用Perl子例程作为方法时,调用,意味着->
左侧的事物被传递到子例程中第一个参数。所以改变你的方法:
sub readSeq {
my ($self, $var1) = @_;
print "$var1\n";
open my $in, '<', $var1 or die "Cannot open file : $!";
while(<$in>) {
chomp $_;
print "$_\n";
}
}
我还将您的文件句柄更改为词法变量而不是全局符号,并将您的open
调用更改为更好的三参数版本。
如果您打算将这些用作对象方法,那么也不需要导出readSeq
和writeSeq
。导出仅适用于您要修改客户端代码的命名空间。所以你可以删除所有这些:
use vars('@ISA');
use vars('@EXPORT_OK');
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(readSeq writeSeq);