2

特定の VM のすべての VMDK を検索し、出力のハッシュを作成するループを作成しました。次に、VMX ファイル内のパラメーターを検索して、ディスクが実際に存在するかどうかをテストします。次に、ディスクが存在しない場合は、ハッシュから削除します。私が直面している問題は、ディスクが定義されていないハッシュ キーを削除する方法です。

コード ブロックは次のとおりです。

    while ($vmx_file =~ m/^(ide(?<PORT>[0-1])\:(?<DISK>[0-1]))\.present\s+=\s+"(?<PRESENT>[^"]+)["]/xmg) {
        $ide_port = "$+{PORT}";
        $ide_disk = "$+{DISK}";
        $present = "$+{PRESENT}";
        if ($present eq 'FALSE') {
            delete $virtual_disks{$vm}{"IDE$ide_port"}{"Disk$ide_disk"}
        }
    } 

これは、上記のステートメントが true であり、不足しているディスクを削除する場合にハッシュとして取得しているものです。

$VAR1 = {
      'Test01' => {
                    'SCSI0' => {
                                 'Disk0' => '/vmfs/volumes/4c8fd27b-5876fc36-80f4-0015179fd63c/Test01/Test01.vmdk',
                                 'Type' => 'lsilogic',
                                 'Disk1' => '/vmfs/volumes/4c8fd27b-5876fc36-80f4-0015179fd63c/Test01/Test01_1.vmdk'
                               },
                    'IDE1' => {
                                'Disk0' => '/vmfs/volumes/4c8fd27b-5876fc36-80f4-0015179fd63c/ubuntu-10.10-desktop-i386.iso'
                              },
                    'IDE0' => {}
                  }

リストされたディスクが VMX ファイルに存在しなかったため、サブ ハッシュ 'IDE0' が空であることがわかります。何もハッシュしない場合にのみ削除したいのですが、IDE の仕様により最大 2 つのディスクを格納できるためです。

4

1 に答える 1

3

最初の削除ラウンドの後、残りのキーを数えます。カウントがゼロの場合は、上位レベルで削除します。

 if (scalar keys %{ $virtual_disk{$vm}{"IDE$ide_port"} } == 0) {
      delete $virtual_disks{$vm}{"IDE$ide_port"}
        }
于 2011-01-15T21:04:13.010 に答える