自动增量哈希值检索

时间:2014-08-28 23:49:58

标签: arrays regex perl hash

我有一个perl脚本telnet到一些网络设备,运行命令来收集一些卡信息并将每一行返回到一个数组,然后我映射到一个哈希。我要做的是执行一个正则表达式来获取哈希中每个字符串值开头的卡号并将它们推入一个数组。但是,只有一半...因为设备中的每张卡在输出中都加倍,因为供应商在命令之后返回信息的方式。

以下是@output,即运行命令后看到的输出。

1/1  1187100L1  , Combo A2+ AE.
1/4  1187100L2  , Combo A2+ K.
1/5  1187100L1  , Combo A2+ V
1/16 1187100L2  , Combo A2+ K
1/1  1187100L1  , Combo A2+ No Alarms
1/4  1187100L2  , Combo A2+ No Alarms
1/5  1187100L1  , Combo A2+ No Alarms
1/16 1187100L2  , Combo A2+ No Alarms

有一部分将@output数组的标量值除以一半。我想要做的是执行$ hash {}检索并按标量/ 2的数量自动递增。

我只想检索前4个卡号,1 / 1,1 / 4,1 / 5和1/16。

有什么建议吗?

这里我的代码部分需要帮助:

if (@output) {
    @ccl = grep ( /Combo/, @output );
    my %hash = map { ++$shn => $_ } @ccl;
    my $an = scalar(@ccl) / 2;
    if ( $hash{0} =~ /^(\d+\/\d+)/ ) {
        push( @numbers, $1 );
        print "@numbers\n";
    }
}

以上工作正常,但仅适用于哈希中的第一个值。我想只为散列中的一半值运行它。

2 个答案:

答案 0 :(得分:1)

这将运行哈希值中前半部分的代码。

foreach my $i (0 .. $an-1) {
    if ( $hash{$i} =~ /^(\d+\/\d+)/ ) {
        push( @numbers, $1 );
    }
}
print "@numbers\n";
顺便说一句,通过将递增数字映射到值来创建哈希似乎很奇怪。那本质上是一个数组,为什么不使用数组呢?

答案 1 :(得分:1)

根据你所写的内容,我认为这就是你想要的。它会从每一行中提取卡号,并使用%seen哈希值将其推送到@numbers,如果它是第一次出现的话。

use strict;
use warnings;

my @output = <DATA>;

my @numbers;
my %seen;
for (@output) {
   next unless /Combo/i;
   my ($card) = /(\S+)/;
   push @numbers, $card unless $seen{$card}++;
}

use Data::Dump;
dd \@numbers;

__DATA__
1/1  1187100L1  , Combo A2+ AE.
1/4  1187100L2  , Combo A2+ K.
1/5  1187100L1  , Combo A2+ V
1/16 1187100L2  , Combo A2+ K
1/1  1187100L1  , Combo A2+ No Alarms
1/4  1187100L2  , Combo A2+ No Alarms
1/5  1187100L1  , Combo A2+ No Alarms
1/16 1187100L2  , Combo A2+ No Alarms

<强>输出

["1/1", "1/4", "1/5", "1/16"]