2014-03-19 56 views
0

這是SeqIO.pmperl的OOP通過可變

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

除了。 – ikegami

回答

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);