0

クラス コンストラクター内にディスパッチ テーブルを作成しようとしています。以下のエラーで実行が失敗します。

エラー: ../lib/Parser.pm のサブルーチン エントリで初期化されていない値が使用されています。../lib/Parser.pm で "strict refs" が使用されている間は、文字列 ("") をサブルーチン ref として使用できません

コード:

package parser;

use strict;
use warning;

@packet = ("join","release","status");
#constructor 
sub new {
        my ($class) = shift;
        my $self = {
           _callerMDN => shift,
           _calleeList => shift,
           _serverIp => shift,
           _packetHandler => {
                join => \&joinHandler, #Dispatch table,variable "join" stores func reference
                release => \&releaseHandler, #variable "release" stores func reference
                status => \&statusHandler #variable "stores" stores func reference
                },
           _mdnHandler => {},

        };

        print ("The Server IP = $self->{_serverIp}\n") if ($debug);
        print ("CallerMDN = $self->{_callerMDN}\n") if ($debug);
        print ("TcpDump File Name = $self->{_tcpdumpFile}\n") if ($debug);

    bless( $self, $class );
    return $self;

}

sub start {
    my ($self,$data) = @_;
    if ($data ~= "Incoming Packet") {
         $self->{_packetHandler}->{$packet[0]}->($data);#**Error while calling "joinHandler" function**
    }
    elsif ($data ~= "Outgoing Packet"){
         $self->{_packetHandler}->{$packet[1]}->($data);#**Error while calling "releaseHandler" function**
    }
    else {
         $self->{_packetHandler}->{$packet[2]}->($data);#**Error while calling "statusHandler" function**
    } 

}

sub joinHandler {
    my ($self,$data) = @_;
    #parse packet
    print ("Incoming Packet parsed");
}

sub releaseHandler {
   my ($self,$data) = @_;
   #parse packet
   print ("Outgoing packet parsed");
}

sub statusHandler {
    my ($self,$data) = @_;
    #parse packet
    print ("status packet");
}

問題を理解して解決するのを手伝ってください。

4

2 に答える 2

1

かなりの問題が見られます。

  1. use warning;する必要がありますuse warnings;

  2. my @packetあなたはあなたの一番上に忘れていましたpackage

  3. sub startあなたには後方=~があり~=ます。eqしかし、おそらくとにかくそうあるべきです。

  4. $debugどこにも宣言されていません。

perl -c問題が発生した場合は、チェック構文 (BEGIN ブロックも実行します)を利用すると便利な場合があります。

于 2013-05-03T06:17:35.490 に答える
0

条件文を見てください。これを試して:

$data eq "Incoming Packet"

いくつかの小さなタイプミスもあります: 警告を使用してください。$debug 変数は初期化されていません。

それが役立つことを願っています。

于 2013-05-03T06:16:38.437 に答える