if(ref($newconfig->{'supervisor'}) ne 'ARRAY' && $newconfig->{'supervisor'} eq undef){
warn "empty set of supers.";
remove_supervisors($self, $id);
}
$newconfig
使用XML
库中的XMLin
导入XML:Simple
(我知道它太可怕了,我应该使用其中一个,但不是我的决定) 。
XML的结构通常如下:
<queue>
<supervisor></supervisor>
<supervisor></supervisor>
</queue>
我正在尝试使用上面的代码实现的是在没有找到主管节时执行remove_supervisors()
函数。所以XML导入,
<queue>
</queue>
每次我尝试&amp;引用要检查的哈希,脚本失败并显示错误
不能使用字符串(“”)作为HASH参考
我还修改了if(!exists $newconfig->{'supervisor'})
,导致同样的错误。
如何检查对象的关联索引是否存在?
答案 0 :(得分:4)
这里有两个重要问题。第一个是你的测试从根本上是错误的,第二个是你可能正在尝试处理格式错误的XML
你的病情
ref($newconfig->{'supervisor'}) ne 'ARRAY' && $newconfig->{'supervisor'} eq undef
以各种方式出错
您正在尝试通过将哈希元素与undef
进行比较来检查是否已定义哈希元素,就好像它是一个字符串一样。你不能这样做;您必须使用defined
代替eq
或==
您的&&
应该是||
在任何其他检查有意义之前,您必须首先测试定义
如果我是你,我首先从散列中提取supervisor
值,然后再继续。它使您的代码更简洁,更易于阅读
my $super = $newconfig->{'supervisor'};
您正在尝试确保supervisor
元素已定义并且是数组引用。因此,如果您正在测试有效性而不是无效,请记住您必须先测试定义首先作为调用ref $supervisor
如果$supervisor
未定义,您会发出警告
if ( defined $super and ref $super eq 'ARRAY' ) { ... }
所以你要否定这个条件,对我来说最简单的方法就是使用unless
而不是if
unless ( defined $super and ref $super eq 'ARRAY' ) { ... }
但我发现有些人对unless
感到不舒服,并且记住not ( A and B)
与not(A) or not(B)
相同,你可以写这个
if ( not defined $super or ref($super) ne 'ARRAY' ) { ... }
$newconfig
您几乎没有显示任何代码,但我认为可以安全地假设
Can't use string ("") as a HASH ref
指的是$newconfig
未定义,因为您在任何显示的代码中都没有使用任何其他内容作为哈希引用
这意味着XMLin
可能会返回一个空字符串""
,你应该调查为什么会这样做
答案 1 :(得分:1)
XML::Simple将空元素解析为空哈希的引用。
if ('ARRAY' ne ref $newconfig->{supervisor}
|| ! grep 'HASH' ne ref || keys %$_, @{ $newconfig->{supervisor} }
) {
另外,$var eq undef
错了。请改用defined。