在Perl中,如何在遍历哈希时跳过空键?

ILi*_*cos 1 perl hash traversal

这是我的问题,我对Perl知之甚少,而且我有这个功能需要修复.

deviceModelMenu()调用此函数时,CLI将显示以下文本:

The following models are available
==================================================
1.   
2. Cisco1240 
3. Catalyst3750 
4. Catalyst3650 
5. HP2524 

第一项是空的,这是错误的,我需要修复它,显示此菜单的代码片段是:

my $features = shift;
print "=" x 50, "\n";
print "The following models are available\n";
print "=" x 50, "\n";
my $i=1;
foreach (keys %{$features->{features}[0]->{deviceModel}})
{
    print "$i. $_ \n";
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

如果我添加以下行:

warn Dumper($features->{features}[0]->{deviceModel});
Run Code Online (Sandbox Code Playgroud)

它抛弃了这个:

$VAR1 = {
      'deviceModel' => {
                         '' => {
                                 'cfg' => []
                               },
                         'Cisco1240' => {
                                        'cfg' => [
                                                 'cisco1240feature.cfg'
                                               ]
                                      },
                         'Catalyst3750' => {
                                           'cfg' => [
                                                    'catalyst3750feature.cfg'
                                                  ]
                                         },
                         'Catalyst3650' => {
                                           'cfg' => [
                                                    'catalyst3650feature.cfg'
                                                  ]
                                         },
                         'HP2524' => {
                                     'cfg' => [
                                              'hp2524feature.cfg'
                                            ]
                                   }
                       }
    };

您可能会注意到,第一项确实是空的.我添加了以下行来跳过它,只打印其余的信息:

if ($_ eq '') {
        shift;
}
Run Code Online (Sandbox Code Playgroud)

但它似乎没有 工作做我想做的.我想跳过该项目,如果它是空的.

Jan*_*dec 6

好吧,转移@ARGV(隐式参数到主程序中的移位)或移位@_(函数中移位的隐式参数)对你没有帮助,因为你没有打印它们中的任何一个.

你可以:

  1. 不首先添加''条目(取决于它是如何生成的)

  2. ''打印前删除条目:

    delete $features->{features}[0]->{deviceModel}->{''};
    
    Run Code Online (Sandbox Code Playgroud)
  3. 不要打印条目:

    if($_ eq '') {
        next;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    if($_ ne '') {
        print "$i. $_ \n";
        $i++;
    }
    
    Run Code Online (Sandbox Code Playgroud)