不能使用字符串(“”)作为HASH引用

时间:2015-10-13 14:28:17

标签: xml perl hash

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'}),导致同样的错误。

如何检查对象的关联索引是否存在?

2 个答案:

答案 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