2017-02-01 7 views
2

私は、データベースへの接続が開かれている「DBCONNECT」私のPerlアプリケーションにサブで

sub new {         
    my $self = {}; 
    $self->{'orcl'} = undef; 
    $self->{'cgi'} = CGI->new(); 
    bless $self; 
    return $self; 
} 

sub getJ { 
    my $self = shift; 
    my $requestmethod = $self->{'cgi'}->request_method; 
    $self->{'orcl'} = dbconnect(); 
    if($requestmethod eq 'POST') { 
     my $testvar = anotherSub(); 
    } 

sub anotherSub { 
    my $self = shift; 
    my $sth = $self->{'orcl'}->functionToFetchRow(); 
} 

を次のような構造を持っています。 だから私の問題はanotherSub「それは完璧な作品「)私はエラーがfunctionToFetchRow( 『メソッドを呼び出すことはできません』を取得することを、今、」私はサブで

$self->{'orcl'} = dbconnect(); 

を行う場合

」です。しかし、私はデータベースへの接続を一度だけ開いて、必要なすべてのSubでは開こうとはしません。

ここに私のせいがありますか?

+4

サブ 'getJ'の最後に波カッコがありません。あなたの問題を実際に見た実際のコードを表示してください。また、完全なエラーメッセージ(おそらく、*で定義されていない値*で終わる)をあなたに渡したかどうかは疑問です。 – Dada

+2

コードのインデントを正しく開始する必要があります。読むのは難しいです。また、同じパッケージにOOPコードと通常の関数が混在しているようです。そのパッケージに 'sub dbconnect'が定義されている場合、それはメソッドでなければならず、' $ self'でも呼び出されます。インポートされている場合は、インポートする必要はありませんが、パッケージを含む完全修飾名を使用する必要があります。そうしないと、後でオブジェクトのメソッドとして使用できるようになります。 '$ class'(' $ self'に似ていますが、パッケージ名を保持しています)を 'sub new'に入れ、そのクラスに' bless'する必要があります。そうしないと後でサブクラス化できません。 – simbabque

+1

Perlタグの[codereview.se]に実際のフルコード(またはインターネット上で公開したいと思う作業用サブセット)を投稿することを検討してください。あなたのスタイルに関するフィードバックをお送りし、コード。 – simbabque

答えて

1

は、このエラーメッセージが$selfundefであることを示しています

未定義値で "​​functionToFetchRow" メソッドを呼び出すことはできません。

$selfanotherSubに渡す必要があります。それについてはわかりません。これを行うには、メソッド構文を使用します。それはそのように呼ばれていた場合

if($requestmethod eq 'POST') { 
    my $testvar = $self->anotherSub(); 
} 

は、Perlは自動的にanotherSubへの最初の引数として$selfに沿って渡します。これは、Perlでのオブジェクト指向の仕組みです。

$self->{'cgi'}->request_method$self->{'orcl'}->functionToFetchRow()の場合は、まったく同じことを使用しています。どちらの場合も、$selfのキー(実際はハッシュリファレンスのみ)にはオブジェクトが含まれており、->methodはそれらのオブジェクトのメソッドを呼び出し、最初の引数としてオブジェクト自体を渡します。

+2

simbabqueあなたは私のヒーローの最後の日です!それは動作し、あなたの助けを借りて私はPerlをさらに理解します!ありがとう! –