【问题标题】:Cause of "strict refs" error“严格参考”错误的原因
【发布时间】: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 strictuse warnings?如果没有,请尝试一下,看看是否能获得更多信息。
  • 如果您想了解更多信息,可以添加use diagnosticsperldoc.perl.org/diagnostics.html
  • 顺便说一句,$self-&gt;Table($table)Table($self,$table) 更有意义。
  • - delete() 是 perl 内部的,如果已定义,它会取消定义变量但返回其值,我用它来删除参数,所以最后发出 Carp... 以警告无效参数- 感谢有关诊断和警告的提示,实际上在 15 年中我从未使用过它:P - 否则表格方法可以正常工作

标签: perl


【解决方案1】:

你在某个地方做了Table("", ...)Table(undef, ...)。 (后者也会发出警告。)

【讨论】:

  • 可能在sub new。我敢打赌“...”不包括将$self 设置为合理的值。
  • $self 是超类创建的对象,它的转储是可以的
  • 你说得对,我确实用 Table("") 清理了一张桌子:P
猜你喜欢
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2018-12-31
  • 1970-01-01
  • 2011-10-07
  • 2017-05-22
  • 2016-02-26
相关资源
最近更新 更多