Анализатор строки

Просьбы о написании новых скриптов или поиске уже существующих.

Модератор: Модераторы

Анализатор строки

Сообщение artemn » 05 июл 2010 12:06

Доброго времени суток.

Написал простейший скрипт с использованием expect, для работы с коммутатором d-link. Проблема возникла при написании анализатора строки.

Всего на коммутаторе 26 портов.
Скрипт должен взять порты из одной переменной.
Затем из второй.
В результате должен записать в 3 переменную порты не входящие в 1 и 2 переменную, причем порт может находиться лишь в одной переменной.

Необходимо также учесть синтаксис коммутатора:
Через тире обозначается диапазон портов идущих по порядку. К примеру 1-26, это все порты.
Через пробел перечисляются любые порты. Например 5,21,26
Возможна смешанная запись. Например 1,7-13,15-16,20,26

Вот пример того как должен отработать анализатор:

set var1 3,9,22,25-26
set var2 23-24
script (берет переменные var1 var2)
script (анализирует данные)
script (присваивает переменной var3 значение)
puts var3 # должен вывести 1-2,4-8,10-21

Опыта программирования практически не имею, надеюсь задачу описал ясно.
Заранее благодарю всех откликнувшихся.
artemn
 
Сообщения: 7
Зарегистрирован: 11 дек 2008 02:59
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Анализатор строки

Сообщение tvrsh » 05 июл 2010 19:54

Благодаря помощи Vertigo с непослушными регэкспами все получилось.
TCL: [ Скачать ] [ Скрыть ]
# Тут задем список всех номеров портов.
set var "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26"
# Первая переменная.
set var1 "3,9,22,25-26"
# Вторая переменная.
set var2 "23-24"

# Перебираем порты из первой переменной.
foreach port1 [split $var1 ","] {

    # Если находим диапазон портов то ...
    if {[string match "*-*" $port1]} {
        # ... определяем начало и конец диапазона.
        regexp -all -nocase -- {^(.*?)-(.*?)$} $port1 -> first last

        # Пока начало не сраняется с концом диапазона удаляем эти порты из списка портов var.
        while {$first != $last} {
            set pos [lsearch [split $var] $first]
            set var [lreplace [split $var] $pos $pos]
            incr first
        }

        # Удаляем конец диапазона из списка.
        set pos [lsearch [split $var] $last]
        set var [lreplace [split $var] $pos $pos]
    }

    # Удаляем обычные порты.
    set pos [lsearch [split $var] $port1]
    set var [lreplace [split $var] $pos $pos]
}

# Все тоже самое для второй переменной.
foreach port2 [split $var2 ","] {

    if {[string match "*-*" $port2]} {
        regexp -all -nocase -- {^(.*?)-(.*?)$} $port2 -> first last

        while {$first != $last} {
            set pos [lsearch [split $var] $first]
            set var [lreplace [split $var] $pos $pos]
            incr first
        }

        set pos [lsearch [split $var] $last]
        set var [lreplace [split $var] $pos $pos]
    }


    set pos [lsearch [split $var] $port2]
    set var [lreplace [split $var] $pos $pos]
}

# Выводим все что осталось после удаления от переменной var.
putlog [join $var ","]

Сохраняй скрипт как dlink.tcl и делай как в примере ниже.

Пример работы:
[19:53:23] <tvrsh> .tcl source scripts/dlink.tcl
[19:53:23] <bionic> [15:53] 1,2,4,5,6,7,8,10,11,12,13,14,15,16,17,18,19,20,21
[19:53:23] <bionic> Tcl:

Только вот как сделать результат с диапазонами я пока не додумался.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi

Re: Анализатор строки

Сообщение artemn » 05 июл 2010 21:33

Мега респект сейчас интегрирую кусок кода в свой скрипт. Надеюсь коммутатор съест такую запись.
artemn
 
Сообщения: 7
Зарегистрирован: 11 дек 2008 02:59
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Анализатор строки

Сообщение artemn » 13 июл 2010 12:16

Отрабатывает с ошибкой. var1 и var2 передаю в качестве аргументов для более удобного ввода и вот что плучаю (

[artemn@xeon ~]$ ./test 25-26 23-24
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22

[artemn@xeon ~]$ ./test 8,25-26 22,24
1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

[artemn@xeon ~]$ ./test 8,25-26 22,24
1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

[artemn@xeon ~]$ ./test 8,25-26 23-24
1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22

[artemn@xeon ~]$ ./test 8,25-26 23
1,2,3,4,5,6,7,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24

[artemn@xeon ~]$ ./test 3-8,25-26 23
1,2,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24
artemn
 
Сообщения: 7
Зарегистрирован: 11 дек 2008 02:59
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Анализатор строки

Сообщение artemn » 13 июл 2010 18:38

Посмотрел повнимательней и нашел ошибку. Во втором цикле вы опечатались была указана не та переменная.

set pos [lsearch [split $var] $port1] должна была быть port2
artemn
 
Сообщения: 7
Зарегистрирован: 11 дек 2008 02:59
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.

Re: Анализатор строки

Сообщение tvrsh » 14 июл 2010 06:06

Спасибо, исправил скрипт в своем сообщении.
Have fun.
-
Получить помощь можно на каналах #egghelp в сети IrcNet.ru и #eggdrop в сети RusNet(Ключ канала eggdrop).
Перед созданием новой темы внимательно читайте Правила оформления топиков.
Аватара пользователя
tvrsh
 
Сообщения: 1230
Зарегистрирован: 19 авг 2008 16:55
Откуда: Russian Federation, Podolsk
Благодарил (а): 6 раз.
Поблагодарили: 130 раз.
Версия бота: Eggdrop 1.6.20+suzi


Вернуться в Заявки на скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron