Как бы я удалил ключи хеша только тогда, когда ключ не имеет значений?

Я построил цикл, который находит все 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"}
        }
    } 

Это то, что я получаю в виде хэша, когда приведенное выше утверждение верно и удаляет отсутствующие диски.

$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', потому что в нем ничего нет. Но Я только хочу, чтобы он удалил его, если он ничего не хэширует, потому что он может иметь до 2 дисков в соответствии со спецификациями IDE.

1 ответ

Решение

Подсчитайте оставшиеся ключи после первого раунда удаления. Если счетчик равен нулю, удалите на более высоком уровне.

 if (scalar keys %{ $virtual_disk{$vm}{"IDE$ide_port"} } == 0) {
      delete $virtual_disks{$vm}{"IDE$ide_port"}
        }
Другие вопросы по тегам