【发布时间】:2014-01-28 20:32:54
【问题描述】:
我对一个对象有一个奇怪的问题(它扩展了超级对象,仅供参考)
变量 $self 已经被超类祝福并且可以正常转储。 我有几十个具有相同设置器/获取器逻辑的包,并且都有“使用严格”。 这个在返回其中一个时给我一个错误,并希望摆脱它。 错误是:
Can't use string ("") as a HASH ref while "strict refs"
返回$self->{"_table"} 行。
为什么这个与其他代码相同的代码行为不同?
如果我之前确实检查了一个类对象,那么消息就消失了。
/* Constructor*/
sub new {
...
Width($self, delete($def->{"width"})) ; # $self is created before already
Table($self,$table) ;
...
}
sub Width
{
my ($self,$ width) = @_ ;
$self->{"_width"} = $width if $width ;
return $self->{"_width"} ;
}
/* WORKING CODE VERSION*/
sub Table
{
my ($self, $table)=@_ ;
return unless $self ;
$self->{"_table"} = $table if $table ;
return $self->{"_table"} ;
}
/* WARNING CODE VERSION*/
sub Table
{
my ($self, $table)=@_ ;
$self->{"_table"} = $table if $table ;
return $self->{"_table"} ; <<<<<< STRICT ERROR
}
【问题讨论】:
-
你在函数delete($def->{"width"})中做了什么,它可能会改变$self结构。请检查一下。你在检查中使用除非它真的返回 $self->{"_table"} 的值吗?
-
您是否包括两者
use strict和use warnings?如果没有,请尝试一下,看看是否能获得更多信息。 -
如果您想了解更多信息,可以添加
use diagnosticsperldoc.perl.org/diagnostics.html -
顺便说一句,
$self->Table($table)比Table($self,$table)更有意义。 -
- delete() 是 perl 内部的,如果已定义,它会取消定义变量但返回其值,我用它来删除参数,所以最后发出 Carp... 以警告无效参数- 感谢有关诊断和警告的提示,实际上在 15 年中我从未使用过它:P - 否则表格方法可以正常工作
标签: perl