1

我正在运行一个 Vmware 脚本,它运行到一半,然后失败并出现以下错误并退出:

Can't use an undefined value as an ARRAY reference at test.pl line 49.

这是在具有约 4000 个虚拟机的 vCetner 清单上运行的。所以我希望脚本忽略这样的错误并继续运行直到它完成。目前脚本在上述错误后退出而没有任何输出。

这是我的代码,它给了我上述错误。我只粘贴了引起错误的几行:

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
        print $vm_mo_ref."\n";
}

这是我为忽略错误所做的:

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (defined $vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (exists $vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if ($vm_mo_ref)
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (ref($vm_mo_ref) eq "ARRAY")
    {   
            print $vm_mo_ref."\n";
    }
}

foreach my $vm_mo_ref ( @{ $host_view->vm } )
{
    if (ref($vm_mo_ref) eq "ManagedObjectReference")
    {   
            print $vm_mo_ref."\n";
    }
}

但是,以上五种具有“if”条件的方法都不起作用,我的脚本仍然失败/退出并出现上述错误。

顺便说一句,ManagedObjectReference是 Vmware 特定的参考。

你能帮我解决这个错误并继续脚本的其余部分。谢谢。

4

2 回答 2

5

尝试

foreach my $vm_mo_ref ( @{ $host_view->vm || [] } )

您在循环中所做的任何更改都不会产生任何影响,因为您的代码甚至在进入循环之前就引发了异常。

于 2012-11-30T07:00:13.990 回答
2

@{ }抛出了错误,所以你的检查来得太晚了。这就是您尽早进行检查的方式:

if (my $vm = $host_view->vm)
{
    foreach my $vm_mo_ref (@$vm)
    {
        print $vm_mo_ref."\n";
    }
}

另一种方法是按需创建数组。这有点浪费,但它使代码清晰。

foreach my $vm_mo_ref (@{ $host_view->vm // [] })
{
    print $vm_mo_ref."\n";
}
于 2012-11-30T09:44:09.140 回答