LINUX.ORG.RU

как удалить\выбрать из массива данные

 , ,


0

1

никак не могу разобраться как работать с массивами Perl

имеется массива @output в котором строки из вывода комманды «sh in des» маршрутизатора cisco типа такого

Gi0/0 up up

Gi0/0.200 up up --managment

Gi0/1 up up

Gi0/1.100 up up --cable_tv

нужно 1) удалить up up из каждой строки массива 2) удалить все из каждой строки после имени сабинтерфейса (наприме gi0/0.200 оставить а остальное удалить и так в каждой строке)

и если можете, посоветуйте простой и понятный учебник по perl\html, без усложнений и самое главное с примерами.

в основном нужна работа с регулярными выражениями и отображением всего на html странице.

нужно написать простую веб морду для цыски. ( создание сабинтерфейса, отображение списка сабинтерфейсов, выключение выбранного сабинтерфейса из списка)

сейчас связь с цыской организована при помощи net::telnet::cisco

сейчас получилось подключиться к цыске, и отображать вывод комманд на html странице.

надеюсь больше на помощь чем на саркастические подколы)

с уважением Владимир

вот сам скрипт

#!/usr/local/bin/perl print «Content-Type: text/html\n\n»;

use Net::Telnet::Cisco; use strict; use warnings;

my $session = Net::Telnet::Cisco->new(Host => '172.17.0.1'); $session->login('perl', 'perl'); my @output = $session->cmd(«show version»); print «<h1>version:</h1>»; print @output; my @output = $session->cmd('show int des'); print «<h1>interfaces:</h1>»; print @output; $session->close; print «<h1>formated version: </h1>»;

my $LTFILE=@output; my $i = 0; for ($i=1;$i<$LTFILE;$i++) { print «<p>@output[$i]</p>»; }

root@perl:~ #

смущает что в интернете обработка массивов идет с их имен анчинающихся с $ а у меня с @

diakon2
() автор топика
Ответ на: комментарий от diakon2
#!/usr/local/bin/perl
print "Content-Type: text/html\n\n";

use Net::Telnet::Cisco; use strict; use warnings;

my $session = Net::Telnet::Cisco->new(Host => '172.17.0.1');
$session->login('perl', 'perl');
my @output = $session->cmd("show version");
print "<h1>version:</h1>"; print @output;
my @output = $session->cmd('show int des');
print "<h1>interfaces:</h1>"; print @output;
$session->close; print "<h1>formated version: </h1>";

my $LTFILE=@output; my $i = 0; for ($i=1;$i<$LTFILE;$i++) { print "<p>@output[$i]</p>"; }

смущает что в интернете обработка массивов идет с их имен анчинающихся с $ а у меня с @

Элемент массива - скаляр.

vsemnazlo
()
Ответ на: комментарий от vsemnazlo

то есть мне нужно обрабатывать не весь массив целиком а каждую строку массива в отдельности, например в цыкело типа такого в котором я вывожу каждую строку на экран?

diakon2
() автор топика
Ответ на: комментарий от vsemnazlo

ага, спасибо попробую, но выложенный скрипт то работает и так нормально)

мне нужно из каждой строки массива удалить 1) «up up» 2) все после номеров сабинтерфесов

и вот как это сделать я хз(

diakon2
() автор топика

нужно 1) удалить up up из каждой строки массива 2) удалить все из каждой строки после имени сабинтерфейса (наприме gi0/0.200 оставить а остальное удалить и так в каждой строке)

Простейшая замена по регулярным выражениям. В цикле по всем элементам

и если можете, посоветуйте простой и понятный учебник по perl\html, без усложнений и самое главное с примерами.

«Изучаем Perl», Шварц, Кристиансен

router ★★★★★
()
Ответ на: комментарий от router

Ага, я ж помню смутно, что там должен быть более вменяемый способ обхода массива.

vsemnazlo
()
Ответ на: комментарий от router

for (my $i=1;$i<$#output;$i++) { $text=@output[$i]; $text=~ s/up//g; print «<p>$text</p>»; }

так корректно удалять часто повторяющиеся слова up ?

diakon2
() автор топика

Кэмел бук, Владимир. Если осилите, а там авторы - лингвисты и повествование ведут увлекательно, сможете очень, очень, очень много автоматизировать. Даже то, что и не предполагали, что поддается автоматизации.

Дичайше рекомендую. Не в качестве rtfm, а как чтиво, которое представит программирование, и место перла в нем глазами хакеров.

Deleted
()
Ответ на: комментарий от Deleted

По сабжу: grep/map/substitute. Вроде:

@new_arr = map { s/\bup\b//gr } @old_arr;

Дай пример файла, покажу как дойду домой.

Deleted
()
Ответ на: комментарий от diakon2
\sup\sup.*$

и любая книга по регулярным выражениям ( regexp, pcre )

router ★★★★★
()
Ответ на: комментарий от Deleted

c up разобрался, сделал так для каждой строки $text=~ s/up//g;

сейчас осталось только удалить из строки все после пробела, чтобы стало так

Gi0/0

Gi0/0.200

Gi0/1

Gi0/1.100

когда изначально было так Gi0/0 up up

Gi0/0.200 up up --managment

Gi0/1 up up

Gi0/1.100 up up --cable_tv

diakon2
() автор топика
Ответ на: комментарий от diakon2

$text=~ s/\s.*//g;

так пойдет?

вообще корректно ли обрабатывать каждую строчку массива через цикл или лучше это както иначе делать?

diakon2
() автор топика
Ответ на: комментарий от diakon2

вообще странно както этот перл работает ( косяки на ровном месте вот вывод print @output;

-----------------

Gi0/1.3010 up up user1

Gi0/1.3011 up up user2

Gi0/1.3012 up up user3

Gi0/1.3013 up up user4

---------------

а вот вывод

for (my $i=1;$i<$#output;$i++) {

$text=@output[$i];

print «<p>$text</p>»;

}

------------------------

</p><p>Gi0/1.3011 up up user

</p><p>Gi0/1.3012 up up user2</p><p>

Gi0/1.3013 up up user3</p><p>

Gi0/1.3014 up up user4</p><p>

что там такое происходит что меняется вывод?

diakon2
() автор топика
Ответ на: комментарий от diakon2

Вообще ничего. Странное происходит, когда тычешь наугад не зная основ. Выдам пару предположений: индекс первого элемента в массиве скорее должен быть отличным от 1, далее, элемент массива скорее скаляр как уже писали выше, хотя это может быть просто синтаксический сахар, ах, еще стоит подумать, что количество элементов массива не равно индексу его крайнего значения.

Anoxemian ★★★★★
()
Ответ на: комментарий от diakon2

чтото не так с циклом или массивом, когда менял $i=1 на $i=22 то ситуация была таже самая только первые 23 строки не выводились

diakon2
() автор топика
Ответ на: комментарий от Anoxemian

и вообще, в perl емнип есть foreach (){}. а интерпретатор один фиг все одинаково сделает.

Anoxemian ★★★★★
()
Ответ на: комментарий от diakon2

так и что делать то? читать десяток книг по 1000 страниц в каждой чтобы поправить 1 баг?

может можно както узнать почему так происходит?

diakon2
() автор топика

через telnet/ssh будет как то костыльно.

Наверное для этих задач больше подойдёт snmp

snaf ★★★★★
()
Ответ на: комментарий от diakon2

Индекс первого элемента массива - 0. На тему синтаксиса таки хоть чуть-чуть повтыкать в азы языка на котором пишешь (удивительно, но это работает).

А на тему что делать вопрос странный. Вот нет у тебя миллиона, что делать? Учиться, страдать, работать? Ты выбрал путь попросить. Вариант, чо.

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

то есть вы разбираясь в языке программирования не знаете почему так происходит, а я почти ничего о нем не зная, должен както разобраться. Вариант, чо.

через снмп будет не менее просто разобраться в вопросе, да и дальнейшее конфигурирование хотелосьбы делать через телнет\ссш, чтобы в случае чего можно было просто поменять в скрипте пару строк. ключевой момент - просто.

по сути для этого осталось совсем немного, а именно - удалять из каждой строки все после первого пробела. но галимый баг все портит.

diakon2
() автор топика
Ответ на: комментарий от diakon2

Нет. Я последний раз им пользовался 10 лет назад и тупо не помню синтаксиса. Но первый элемент 0 в любом языке. И да, я знаю как исправить баг. И да, ты ничего не должен. Не разбирайся, пиши тупо варианты, какой-нибудь да и сработает, это же perl ))

Anoxemian ★★★★★
()
Ответ на: комментарий от Anoxemian

умиляют люди которые говорят что знают но не скажут.

и зачем вы так приципились к первому элементу? проблема не в первом а в 24 и последующих

diakon2
() автор топика
Ответ на: комментарий от diakon2

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

Anoxemian ★★★★★
()
use Data::Dumper;

@output = (
    'Gi0/0 up up',
    'Gi0/0.200 up up --managment',
    'Gi0/1 up up',
    'Gi0/1.100 up up --cable_tv',
    );

# удаляем ' up up'
@example = map { s/(\sup){2}//gr } @output;

print Dumper @example;

#$VAR1 = 'Gi0/0';
#$VAR2 = 'Gi0/0.200 --managment';
#$VAR3 = 'Gi0/1';
#$VAR4 = 'Gi0/1.100 --cable_tv';

# оставляем только сабинтерфейс
@example = map { (split)[0] } @output;

print Dumper @example;

#$VAR1 = 'Gi0/0';
#$VAR2 = 'Gi0/0.200';
#$VAR3 = 'Gi0/1';
#$VAR4 = 'Gi0/1.100';
Deleted
()
Ответ на: комментарий от bodqhrohro_official

В Pascal можно любую точку отсчёта задавать.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от diakon2

1) сделал, хорошо что в цыске есть еще команды отдающие нужную мне информацию.

2) перл йопнутый язык, в очередной раз убеждаюсь

3) foreach - результат тотже

4) в очередной раз, отписываясь на этом форуме, мне либо рекомендуют сделать подругому, когда мне надо именно так, либо кичатся своими мозгами, мол умные ниипацца но ничего не скажем, ибо надо 100500 книжек прочитать перед тем как написать хэлоу ворлд. ага, целесообразность зашкаливает. и только еденицы адекватно отвечают, чотко и по делу.

5) подозрение на какуюто хероту в массиве посередине, чтото типа разделения в телнет сессии когда выводится большой кусок текста и просят нажать пробел для пролистывания вниз. тупо массив интерпретатор выводит нормально, а когда начинается построчный вывод то вылазит какойнибуть символ который проглатывается при целиковом выводе массива. проверим...

6) синтаксис... ояепу, да точно, синтаксис.... просто рукалицо.

diakon2
() автор топика
Ответ на: комментарий от diakon2

эх, еслибы массив задавался вручную... он берется отсюда

use Net::Telnet::Cisco;

my $session = Net::Telnet::Cisco->new(Host => '172.17.0.1');

$session->login('perl', 'perl');

my @output = $session->cmd('show int des');

diakon2
() автор топика
Ответ на: комментарий от Deleted

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

попробовал более длинный кусок текста отдаваемый цыской.

первые 23 строки выглядят так

</p><p>Current configuration : 16318 bytes

</p><p>!

</p><p>upgrade fpd auto

</p><p>version 12.4

</p><p>service timestamps debug datetime msec

</p><p>service timestamps log datetime msec

</p><p>service password-encryption

24я вот так

</p><p>!</p><p>

и дальше цыклически,все вот так

aaa session-id common</p><p>

ip source-route</p><p>

ip cef</p><p>

!</p><p>

!</p><p>

ip dhcp excluded-address 10.25.38.1 10.25.38.10</p><p>

и каждая 24я вот так

</p><p> default-router 10.25.101.1 </p><p>

думаю все таки дело в модуле net::telnet::cisco который каждую 24 строку както маркирует в массиве и при его прямом выводе это незаметно но при выводе построчно а еще и с обработкой вылазят траблы.

diakon2
() автор топика
Ответ на: комментарий от diakon2

Дело не в «кичатся», просто

нужно написать простую веб морду для цыски. ( создание сабинтерфейса, отображение списка сабинтерфейсов, выключение выбранного сабинтерфейса из списка)

тебе не осилить с такими знаниями Perl. Только мозги всем затрахаешь.

Deleted
()
Ответ на: комментарий от Deleted

осилил, лет 8-9 назад, причем не сильно уж потрахивая мозги коллеге. ну 1-2 вопроса в день как сегодня. и он не разводил демогогию на 10 постов о том что нужно читать книги, а просто взял и ответил. 20-30 секунд на озвучивание вопроса и примерно столькоже на ответ.

справился меньше чем за неделю.

diakon2
() автор топика
Ответ на: комментарий от Deleted

и да, для создания саба\отображения саба\выключения саба уже почти все готово. но готово технически, нужно ведь сделать еще и красиво, с кнопочками и выпадающими менюшками.

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

даже ту проблему которую не смогли решить вы - великие умы, я решил сам, пускай и другим путем.

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

diakon2
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.