1

这是我的问题,我对 Perl 不是很了解,而且我有这个功能需要修复。

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

有以下型号可供选择
====================================================
1.   
2.思科1240
3.催化剂3750
4.催化剂3650
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++;
}

如果我添加以下行:

warn Dumper($features->{features}[0]->{deviceModel});

它转储了这个:

$VAR1 = {
      '设备型号' => {
                         '' => {
                                 'cfg' => []
                               },
                         'Cisco1240' => {
                                        'cfg' => [
                                                 'cisco1240feature.cfg'
                                               ]
                                      },
                         '催化剂3750' => {
                                           'cfg' => [
                                                    'catalyst3750feature.cfg'
                                                  ]
                                         },
                         'Catalyst3650' => {
                                           'cfg' => [
                                                    'catalyst3650feature.cfg'
                                                  ]
                                         },
                         'HP2524' => {
                                     'cfg' => [
                                              'hp2524feature.cfg'
                                            ]
                                   }
                       }
    };

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

if ($_ eq '') {
        shift;
}

但是好像没有工作做我想做的。如果它是空的,我想跳过它。

4

3 回答 3

6

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

您可以:

  1. 首先不添加''条目(取决于它的生成方式)

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

    delete $features->{features}[0]->{deviceModel}->{''};
    
  3. 不要打印条目:

    if($_ eq '') {
        next;
    }
    

    或者

    if($_ ne '') {
        print "$i. $_ \n";
        $i++;
    }
    
于 2012-04-25T19:41:20.997 回答
4
foreach(键 %{$features->{features}[0]->{deviceModel}})
{
    下一个除非长度($_);
    打印 "$i. $_ \n";
    $i++;
}
于 2012-04-25T19:42:12.883 回答
3
#!/usr/bin/env perl

use strict; use warnings;

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


{
    my $item = 1;
    for my $d (grep length, keys %{ $devices->{deviceModel} }) {
        printf "%2d. %s\n", $item++, $d;
    }
}

输出:

1.催化剂3750
 2.思科1240
 3.催化剂3650
 4.HP2524
于 2012-04-25T19:59:05.770 回答