为什么这行Perl代码会抛出数字gt警告?

时间:2011-02-23 22:08:15

标签: perl warnings moose

我有以下条件:

if ($self->path ne 'contact_us' && !grep { $status == $_ } 2, 3, 8) {

它正在抛出这个警告:

  

在数字gt(>)

中使用未初始化的值

当然,表面上根本没有数字gt。 $ self-> path是一个Moose属性访问器,所以唯一的底层魔法就是来自那个。但我无法看到如何进行数字gt比较,特别是因为path定义如下:

has 'path' => (is => 'rw', isa => 'Str');

关于如何抛出此警告的任何想法?我正在使用为i386-linux-thread-multi构建的Perl v5.8.8,如果在这种情况下很重要的话。

更新:更神秘的是,我重写了条件如下:

my $cond1 = $self->path ne 'contact_us';
my $cond2 = !grep { $status == $_ } 2, 3, 8;
if ($cond1 && $cond2) {

它是第三个​​行抛出警告。 Carp::Always的堆栈跟踪信息量不足。一些进一步的披露,因为我现在感到完全无能为力:基本文件是由Apache的mod_fcgi调用的FastCGI脚本。

上次更新: 通过调用另一个模块($status)中找到的方法来设置My::Session。这是在该模块的方法中生成警告的行(请注意错误的>):

my $disputes => dbh('b')->selectrow_hashref($query);

令我困惑的是为什么警告没有引用包含违规行的模块(它引用了进行方法调用的模块My::Page)。这是Carp::Always的完整输出;完全没有提到My::Session

  

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   stderr:使用未初始化的值   /path/to/My/Page.pm中的数字gt(>)   第65行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   \ t第:: BUILD( '我的::网页::帮助= HASH(0xa7ce788)',   'HASH(0xa327904)'号召   /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Class/MOP/Method.pm   第123行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   \ tClass :: MOP ::方法::执行( '穆斯::元::方式= HASH(0x9fa357c)',   '我::网页::帮助= HASH(0xa7ce788)',   'HASH(0xa327904)'号召   /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Moose/Object.pm   第57行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   stderr:\ tMoose :: Object :: BUI,referer:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   LDALL( '我的::网页::帮助= HASH(0xa7ce788)',   'HASH(0xa327904)'号召   /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Moose/Meta/Class.pm   第278行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   \ tMoose ::元::类:: new_object( '级:: MOP ::类::的 ANON :: SERIAL :: 1 = HASH(0xa3397c8)',   'HASH(0xa327904)'号召   /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/Moose/Object.pm   第26行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   \ tMoose ::对象::新的( '我的::网页::帮助',   'HASH(0xa339d38)')调用生成   方法(未知来源)第3行,   引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   标准错误:   \ TMY ::页面::新的(“我的::网页:: Suppo,   引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   stderr:rt','HASH(0xa339d38)')调用   在/path/to/My.pm第44行,引用者:   https://testserver.domain.tld/help

     

[Wed Feb 23 17:44:29 2011] [warn]   [client ---.---。94.159] mod_fcgid:   stderr:\ tTy :: start()调用了   index.fcgi第9行,引用者:   https://testserver.domain.tld/help

2 个答案:

答案 0 :(得分:2)

我的猜测是你的一个参数是一个重载的对象,而且重载正在抛出错误。检查确切的参数是什么:

print "$_: ", ref, $/ for $self, $self->path, $status;

哪个应该打印如下:

HASH(0x12341234)=Self::Object: Self::Object
some/path:
4:

如果你得到了:

HASH(0x12341234)=Self::Object: Self::Object
some/path: Some::Object
4: Some::Other::Object

然后你应该查看每个包,看看是否存在重载。

你也可以写一个bool函数,它会强制一个值进入一个非重载的bool:

sub bool {$_[0] ? 1 : 0}

然后:

my $cond1 = bool $self->path ne 'contact_us';
my $cond2 = bool !grep { $status == $_ } 2, 3, 8;
if ($cond1 && $cond2) {

如果这样可以解决问题,那么至少有一个参数是一个行为不当的重载对象。

这也可能是由use bigint;use bignum;之类的自动装箱编辑引起的,它将2, 3, 8之类的文字数字转换为重载对象。这样的pragma有效吗?

答案 1 :(得分:1)

我很确定你没有在你粘贴的代码之上的某个位置正确设置$ status。您可能也使用旧版本的Perl,因为在我的MBP上的ActiveState 5.12中,它将打印出失败的变量名称,就像在FreeBSD下的5.10一样。在基于Linux的VPS上,5.8.8下,变量名称不是失败消息的一部分。

通过不仅仅是几行代码来提供帮助会更容易,因为通常不会在程序死亡的行上找到这种错误的根本原因,但由于变量并不是真正持有你认为它持有的东西。