2016-08-29 11 views
0

これは私の初めてのPerlでのOOPの使用です。私は仕事中の4k行の手続き型プログラムをリファクタリングする過程にあります。それはかなりまっすぐ進むようですが、私は継承とSUPERに問題があります。Perl - "Module :: SUPER"でオブジェクトメソッドを見つけることができません

エラーメッセージ:私は試してみました

"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10" 

、使用ベース、親と@ISAを設定したが、それらはすべて同じエラーを取得します。私は何かを見落とさなければならないと確信しています。

(これは私が働いているプログラムからのコードではありません。同じエラーを生成するだけの例)

すべての.pmと.plのファイルは、この例では、同じディレクトリにあります。プログラムで私はメインプログラムで作業しているbinにあり、モジュールは../modules(ビンに相対)になります。
私はこれは私がその仕事をするために必要なすべてのだろうと仮定します:

use lib "../modules"; 

私が私に教えてくださいことを考えで間違っている場合。

親モジュール

package BaseModule; 
use strict; 
use warnings; 
sub new { 
    my $class = shift; 
    my $self = { 
     ARRAY => shift, 
     DIVIDER => "," 
    }; 
    bless ($self, $class); 
    return $self; 
} 
sub array { 
    my $self = shift; 
    if(@_) { $self->{ARRAY} = shift }; 
    return $self->{ARRAY}; 
} 
sub divider { 
    my $self = shift; 
    if(@_) { $self->{DIVIDER} = shift }; 
    return $self->{DIVIDER};  
} 
sub testSub { 
    my $self = shift; 
    print join($self->{DIVIDER}, @{ $self->{ARRAY} }); 
    return 1; 
} 

1; 

子モジュール

package Module; 
use strict; 
use warnings; 
#use base qw(BaseModule); 
#require BaseModule; 
#our @ISA = qw(BaseModule); 
use parent qw(BaseModule); 
sub new { 
    my $class = shift; 
    my $self = $class->SUPER::New(@_); 
    $self->{STRING} = shift; 
    bless ($self, $class); 
    return $self; 
} 
sub string { 
    my $self = shift; 
    if(@_) { $self->{STRING} = shift }; 
    return $self->{STRING}; 
} 
sub testSub { 
    my $self = shift; 
    print "$self->{STRING}:\n"; 
    $self->SUPER::testSub(); 
    return 1; 
}  
1; 

私は親クラスがすでに祝福$自己を返す場合、子クラスを祝福する必要がありますか?

メインスクリプト

#!/usr/bin/perl 
use strict; 
use warnings; 
use Module; 

my $module = Module->new([1, 2, 3, 4, 5], "Example"); 
$module->divider(" | "); # Test Changing divider; 
$module->testSub(); 

すべてのヘルプは大歓迎です。

+2

'S /新/' ... –

+0

は、私はそれが@elを何を意味するのかわからないんだけど/新しいです.pescado – Adam

答えて

2
"Can't locate object method "New" via package "Module::SUPER" at Module.pm line 10" 

あなたは(あなたがBaseModule::newを意味するのですか?Perlは大文字と小文字が区別されます)が定義されていないBaseModule::New whisを呼び出そう。

親クラスがすでに$ selfを祝福した を返す場合、子クラスを祝福する必要がありますか?

いや、その時点で$selfは、すでにあなたがScalar::Util::blessed()によることを確認することができ(祝福された。

+0

うわー、私はそれを完全に見落とした。その事件は私の問題だった。新しい対新。それは今働く。ありがとう! – Adam

関連する問題