我最近的代码审查有问题。建议我更改以下函数调用:
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行处使用明确的软件包名称。
所以我一定对这个说明有误解。有什么明显的错误吗?
答案 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