2014-08-28 3 views
0

У меня есть скрипт perl, который telnets к некоторому сетевому оборудованию, запускает команду для сбора информации о карте и возвращает каждую строку в массив, который затем отображается в хэш. То, что я хочу сделать, это выполнить регулярное выражение, чтобы захватить номера карт в начале каждого строкового значения в хэше и вставить их в массив. Но только половина из них ... Потому что каждая карта в оборудовании удваивается в выводе из-за того, как поставщик возвращает информацию после команды.Автоматическое увеличение значения хэш-значения

Ниже приведено описание @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 {} retrieve и auto increment, что по числу скаляров/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"; 
    } 
} 

выше работает отлично, но только для первого значения в хэш. Я хочу запустить это только для половины значений в хэше.

+0

Что вы имеете в виду под "автоматическим приращением"? Единственное использование этого термина, который я знаю, - в базах данных, где столбец идентификатора автоматически присваивается с добавочными значениями при вставке строк. Чем он отличается от простого увеличения значения в хеше? – Barmar

+0

В вашем коде вы никогда не используете переменную '$ an'. Разве это не то, что вы сказали, что хотите использовать в автоматическом приращении? – Barmar

+0

Точно, его переменная $ an, которую я хочу автоматизировать, увеличивает значение хэша, которое в этом случае является числом 4. Но я не знаю, как применить его между {} в $ hash {}. Что я подразумеваю под автоматическим приращением, так это возможность писать следующие строки в одной строке: $ hash {0} $ hash {1} $ hash {3} $ hash {4} Автоматически основан на числе в $ an. Если я делаю $ hash {$ an}, это просто означает $ hash {4}. Я хочу, чтобы он выполнял эту команду в секундах в $ an. – erik907

ответ

1

Это запустит ваш код для первой половины значений в хэше.

foreach my $i (0 .. $an-1) { 
    if ($hash{$i} =~ /^(\d+\/\d+)/) { 
     push(@numbers, $1); 
    } 
} 
print "@numbers\n"; 

BTW, кажется странным создавать хэш путем сопоставления инкрементных чисел со значениями. Это по существу массив, так почему бы просто не использовать массив?

+0

Я положил его в хэш, поэтому я мог бы использовать reg ex против скалярных значений, потому что grepping через массив не возвращает только шаблон, который я искал, но всю строку.Теперь, когда вы упомянули об этом, я мог бы сделать это только с массивом, как в $ array [0] 'или что-то в этом роде. я побежал выше, и он запускает цикл, но толкает подходящий шаблон к концу массива в 4 раза, как этот «1/1 1/1 1/ 1/1 1/4 1/5 1/1 1/4 1/5 1/16 ' – erik907

+0

Я скорее хочу, чтобы только каждый набор чисел возвращался один раз, потому что после этого я буду запускать другую команду, основанную на этих числах, чтобы получить отдельную статистику на каждой карте и затем хранить в базе данных. Он отлично работает так, как есть, но он удваивает данные, возвращаемые в конце. – erik907

+0

Вы печатаете массив каждый раз через цикл. Таким образом, вы видите это, когда оно растет. Возможно, вам следует переместить оператор 'print' за пределы цикла. – Barmar

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"] 
Смежные вопросы