我正在运行一个Vmware脚本,它会在一半时间内通过,然后失败并出现以下错误并退出:
Can't use an undefined value as an ARRAY reference at test.pl line 49
。
这是在vCetner库存上运行的,该库存有大约4000个VM。所以我希望脚本忽略这些错误并继续运行直到它完成。目前,脚本在出现上述错误后退出任何输出。
这是我的代码,它给了我上面的错误。我只粘贴了几行错误:
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”条件的方法都不起作用且我的脚本仍然失败/退出并出现上述错误。
BTW,ManagedObjectReference
是Vmware特定的参考。
你能帮助我解决这个错误并继续使用脚本的其余部分。 感谢。
答案 0 :(得分:5)
尝试
foreach my $vm_mo_ref ( @{ $host_view->vm || [] } )
循环中没有任何改变会产生任何影响,因为你的代码在进入循环之前会抛出异常。
答案 1 :(得分: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";
}