【问题标题】:How would I delete hash keys only when the key has no values?仅当键没有值时,我将如何删除哈希键?
【发布时间】:2011-01-15 20:19:31
【问题描述】:

我已经构建了一个循环来查找特定 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"}
        }
    } 

当上述语句为真并且删除丢失的磁盘时,这就是我得到的哈希值。

$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 个磁盘。跟我来?

【问题讨论】:

  • 我很难理解您要处理的情况。通常,Perl 问题很快就会得到答案,所以这要么比平时更难回答,要么更难理解——我认为是后者。你实验了吗?我试图了解您在要删除的数据结构中可能拥有的内容,但我无法理解您的哈希散列中可能包含的内容。您的主代码块显示哈希的哈希值。您可能正在寻找 defined,但如果没有定义,通常不需要删除。
  • 对不起,我的想法很糟糕,让我更新我的问题,以便更清楚地了解我的需求。

标签: perl hash-of-hashes


【解决方案1】:

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

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

【讨论】:

  • 我不得不对您的解决方案进行一些细微的修改,但这个想法绝对完美。我需要 IF 语句在散列中再往下看一层。感谢您的帮助。
  • 这里不需要“标量”。 == 运算符在两边都施加标量上下文。
  • 但是scalar 使代码的意图更加清晰。如果只有更多的程序员会做这么多不必要的事情......
  • 对我来说,“标量”使代码不那么清晰。它让我去寻找一个不存在的列表上下文。
猜你喜欢
  • 2015-12-18
  • 2013-03-30
  • 2013-10-09
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2021-05-25
  • 1970-01-01
相关资源
最近更新 更多