Perl:问题通过自我

时间:2018-08-21 21:08:31

标签: perl

我最近的代码审查有问题。建议我更改以下函数调用:

 storeShmcoreservJobsLogs(
    $self->{'shmJobDetails'},
    $self->{'nhcJobDetails'},
    $self->{'cppDetails'},
    $self->{'siteId'},
    $neTypesIdMap,
    $dbh
);

仅使用两个参数,分别为$self$dbh。所以我的编码如下

storeShmcoreservJobsLogs($self, $dbh);

和函数签名如下:

sub storeShmcoreservJobsLogs($$) {
  my($self, $dbh) = @_;

  if ( $#{$self->$shmJobDetails} > -1 ) {

不幸的是,当我测试更改时,if语句引发了一个错误,值为$shmJobDetails

  

全局符号“ $ shmJobDetails”要求在/data/ddp/current/analysis/TOR/elasticsearch/handlers/misc/Shm.pm第148行处使用明确的软件包名称。

所以我一定对这个说明有误解。有什么明显的错误吗?

2 个答案:

答案 0 :(得分:1)

没有变量view.setVisibility(...); ,因此会出现编译错误。做与以前相同的事情:

$shmJobDetails

现在,您要传递完整的对象,并且子例程可以使用它所需的对象的任何部分。

您可能想创建一些对象方法来回答您要问的问题,而不是访问其内部。该方法可以完成所有工作,以查明是非。

sub storeShmcoreservJobsLogs {
    my($self,$dbh)=@_;

    if ( $#{ $self->{'shmJobDetails'} } > -1 ) {

答案 1 :(得分:0)

使用称为$self的词法变量意味着您正在使用面向对象的方法,但是您的代码远非面向对象的

您确定您了解代码检查中提出的要点吗?似乎您正在编写方法,并且应该在方法

中从哈希中提取字段。

方法定义应该更像这样

sub store_shmcoreserv_jobs_logs {
    my $self = shift;
    my ($id_map, $dbh) = @_;

    my @fields = @{$self}{qw/ shmJobDetails nhcJobDetails cppDetails siteId /};

    ...

通话看起来应该像这样

$self->storeShmcoreservJobsLogs($neTypesIdMap, $dbh)

所有这些对于Perl面向对象的编程都是必不可少的。您应该将perlobj和其他Perl language reference

一起学习