1

Vmware スクリプトを実行していますが、途中まで行った後、以下のエラーで失敗して終了します。

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

これは、約 4000 個の VM を持つ 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」条件を使用した上記の 5 つのアプローチはどれも機能せず、スクリプトは前述のエラーで失敗/終了します。

ところで、ManagedObjectReferenceVmware 固有のリファレンスです。

このエラーを回避し、残りのスクリプトを続行するのを手伝っていただけませんか。ありがとう。

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 に答える