Я пишу код для разбора всех интерфейсов на моей сети, ищет для определенных конфигураций .. и т.д.Разбор данных с perl- захватив диапазон текста
данных выглядит следующим образом:
Interface fa1
mode access
port-security
mac-address sticky
!
interface fa2
mode trunk
!
В основном, начиная с «^ интерфейса» и заканчивая «!».
мой текущий алгоритм является «запись» данных мне нужно
foreach $line (@input) {
if ($line =~ m/^interface.+\d/ && $line !~ m/interface Embedded-Service-Engine|BRI|TenGigabitEthernet|vlan|Port-channel|ATM|loopback/i) {
$record = 1;
}
#$int ne '' is to handle the rest of the file not in this format
if($line =~ m/!/ && $int ne '') {
#save data in format 'interface fa2,mode trunk'
#if the interface doesn't have port-security
push(@intlist, join(','split("\r\n",$int))."\n") unless $int =~ m/port-security/;
$record=0;
$int='';
}
if ($record) {
$int.=$line;
}
}
в то время как это работает в моем случае, я хотел бы просто способ сделать это. Я искал и нашел, что вы можете использовать оператор диапазона «..» на регулярное выражение
который превращает мой код в:
@input # contains the file
@interfaces = grep (/^interface.+\d/ .. /!/, @input);
, который дает мне все данные интерфейса, проблема теперь каждая строка является единственным элементом массива @interfaces
. как я могу разделить эти данные так, чтобы все от /^interface.+\d/ .. /!/
было одним элементом в этом массиве, не создавая больше для циклов?
Цель состоит в том, чтобы довести его до одного элемента, поэтому я могу отсканировать его для интерфейсов. Я не хочу смотреть на interface Embedded-Service-Engine|BRI|TenGigabit
, а также на интерфейсы, которые имеют правильные конфигурации.
Хорошо. Я вижу, к чему вы клоните. Чтобы ответить на ваш вопрос «Зачем использовать усложняющий хеш?»: Это зависит. Поскольку вы просто помещаете строки в @int, ваши данные кажутся немного неструктурированными. Если вы только цель, зная, какие интерфейсы имеют подстроки $ seach, а не $ dontwant в них, я бы сказал нет. Если вам действительно нужно что-то делать с интерфейсами и их базовыми полями, то да, будет полезно использовать хэш для некоторой структуры. Я думаю, что справедливый вопрос - спросить, что будет, что вам нужно делать с вашими данными. Еще одна вещь: используйте локальный для своего разделителя. ;) –
@mlambrichs Спасибо, я пытался «мой» разделитель, но не компилировался. местные работы просто прекрасны. – genx1mx6
Также: «строгое» и «предупреждение» настоятельно рекомендуется. – Sobrique