我有以下条件:
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
答案 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下,变量名称不是失败消息的一部分。
通过不仅仅是几行代码来提供帮助会更容易,因为通常不会在程序死亡的行上找到这种错误的根本原因,但由于变量并不是真正持有你认为它持有的东西。