仅当密钥没有值时,我如何删除哈希密钥?

时间:2011-01-15 20:19:32

标签: perl hash-of-hashes

我已经构建了一个循环,可以找到特定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' => {}
                  }

正如您所看到的,子哈希“IDE0”为空,因为列出的磁盘不存在于VMX文件中。现在我要做的是删除整个“IDE0”哈希,因为没有任何内容但是我只希望它删除它,如果它什么都不哈希。因为根据IDE规范,它最多可以有2个磁盘。跟我来?

1 个答案:

答案 0 :(得分:3)

在第一轮删除后计算剩余的密钥。如果计数为零,则在更高级别删除。

 if (scalar keys %{ $virtual_disk{$vm}{"IDE$ide_port"} } == 0) {
      delete $virtual_disks{$vm}{"IDE$ide_port"}
        }