【问题标题】:create dispatch table inside class constructor in perl在 perl 的类构造函数中创建调度表
【发布时间】:2013-05-03 05:17:47
【问题描述】:

我正在尝试在类构造函数中创建调度表。执行失败并出现以下错误。

错误: 在 ../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");
}

请帮助我理解并解决问题。

【问题讨论】:

    标签: perl package hashtable


    【解决方案1】:

    我看到了很多问题。

    1. use warning; 应该是use warnings;

    2. 您忘记在package 顶部添加my @packet

    3. sub start 中,=~ 向后变为~=。但无论如何它可能应该是eq

    4. $debug 未在任何地方声明。

    当您遇到问题时,您可能会发现利用 perl -c 检查语法(也运行 BEGIN 块)很有用。

    【讨论】:

      【解决方案2】:

      看看你的条件语句。 试试这个:

      $data eq "Incoming Packet"
      

      还有一些小错别字: 使用警告; 并且 $debug 变量未初始化。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-12
        • 2011-02-16
        • 2018-12-14
        • 1970-01-01
        • 2011-12-07
        • 2019-03-14
        相关资源
        最近更新 更多