perl OOP传递变量

时间:2014-03-19 03:36:22

标签: perl

这是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)时,有什么不对吗?

1 个答案:

答案 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调用更改为更好的三参数版本。

如果您打算将这些用作对象方法,那么也不需要导出readSeqwriteSeq。导出仅适用于您要修改客户端代码的命名空间。所以你可以删除所有这些:

use vars('@ISA');
use vars('@EXPORT_OK');
require Exporter;

@ISA = qw(Exporter);
@EXPORT_OK = qw(readSeq writeSeq);