1

如果在 Perl 模块中我有一个“新”函数声明:

 my $self = $class->SUPER::new($pArgsProcessor, $pResponse, kStrFormatHtml);
 $self->{mStrRunType} = $pArgsProcessor->readQueryString('runType');
 $self->{mStrStartDate} = $pArgsProcessor->readQueryString('startdate');
 $self->{mStrEndDate} = $pArgsProcessor->readQueryString('enddate');
 bless $self, $class;
 return $self;

有没有办法在另一个函数中使用存储在“$self”中的数据?我正在尝试使用“mStrRunType”

4

2 回答 2

5

$self可能是一个对象,并且您包中的所有子都可以称为方法。然后:

my $object = Your::Class->new(...);

$object->foo(42);

foo方法内部,对象将是第一个参数:

sub foo {
  my ($self, $meaning_of_life) = @_;
  say "mStrEndDate = $self->{mStrEndDate}";
  ...;
}

笔记:

  • 您通常不应该$self在构造函数中使用。如果编写超类以支持继承,则$class->SUPER::new(...)确保引用被祝福到正确的$class.
  • 您的命名方案建议您可能想要使用更复杂的数据结构:

    $self->{mStr} = {
      RunType   => ...,
      StartDate => ...,
      EndDate   => ...,
    };
    
于 2013-08-14T15:35:54.917 回答
0

您的构造函数看起来正确。假设您的构造函数与此类似:

sub new {
   my $class = shift;
   my $pArgsProcessor, $pResponse, kStrFormatHtml; #shift your constructor params..

   my $self = $class->SUPER::new($pArgsProcessor, $pResponse, kStrFormatHtml);
   $self->{mStrRunType} = $pArgsProcessor->readQueryString('runType');
   $self->{mStrStartDate} = $pArgsProcessor->readQueryString('startdate');
   $self->{mStrEndDate} = $pArgsProcessor->readQueryString('enddate');

   bless $self, $class;
   return $self;
}

那么您的方法应该能够使用您的参数:

sub test {
   my $self = shift;

   if (defined $self->{mStrEndDate}) {
       print $self->{mStrEndDate};
   } else {
       print "not defined?";
   }
}

如果您的键仍未定义,请确保 $pArgsProcessor 方法返回已定义的值。

于 2013-08-14T15:42:14.727 回答