Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Большой хэш, Может есть другое решение? 
:(
    Опции темы
Suic2
Дата 1.10.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Всем привет, есть ссылка на хэш такого вида:

Код

$VAR1 = {
   '10.255.250.10' => {
                          '11' => {
                                    '6c:62:6d:4a:d0:17' => 4
                                  },
                          '7' => {
                                   '00:30:48:21:13:4c' => 1383
                                  },
                          '12' => {
                                    '00:1d:92:33:53:bb' => 4
                                  },
                          '1' => {
                                   'c8:60:00:6e:ab:ae' => 18
                                  },
                          '4' => {
                                   '6c:62:6d:aa:d1:83' => 8
                                  },
                          '18' => {
                                   '64:a7:69:dd:06:d7' => 4,
                                   '8c:77:12:dd:1f:a4' => 171,
                                   '00:90:4c:dd:fa:ea' => 114,
                                   'a4:e7:31:dd:8d:fc' => 108,
                                   '70:05:14:b5:3d:9d' => 28,
                                   '00:15:af:dd:f0:cf' => 2
                                  },
                          '13' => {
                                   '6c:62:6d:4a:dd:e1' => 2
                                  },
                          '5' => {
                                   'e8:11:32:2b:ff:c7' => 4,
                                   '00:14:0b:0a:gg:fc' => 13,
                                   '00:18:f3:c4:hh:55' => 6,
                                   '00:50:8d:b7:jj:47' => 12,
                                   '00:16:17:93:kk:ff' => 14,
                                   'c8:60:00:56:42:33' => 15
                                  }
                        }
        };

в котором хранятся следующие данные:
$hs->{ip железки}->{порт}->{мак адреса}=кол-во записей

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

@keys1=keys(%$hs);
foreach $key1 (@keys1)
{
    @keys2=keys(%{%$hs->{$key1}});
    foreach $key2 (@keys2)
    {
        @keys3=keys(%{%{%$hs->{$key1}}->{$key2}});
        $count=0;
        foreach $key3 (@keys3)
        {
            $count++;
            print "$key1:$key2 error \n" if $count>5;
        }
    }
}


Может есть более элегантное решение?

Это сообщение отредактировал(а) Suic2 - 1.10.2012, 14:53
PM MAIL   Вверх
Suic2
Дата 1.10.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Может вообще это с помощью sql решается? Ведь изначально данные оттуда и берутся)
Создал тему в разделе SQL, 
Ссылка
PM MAIL   Вверх
vadiml
Дата 1.10.2012, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



print scalar( keys %hash );
напишет сколько ключей в этом хеше.
PM MAIL Jabber   Вверх
Suic2
Дата 1.10.2012, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет




vadiml, спасибо

ПС: вопрос насчёт sql остаётся открытым:)
PM MAIL   Вверх
TP@MB@Y
Дата 1.10.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: нет
Всего: 4



Код

while (my ($ip, $port) = each %$hs) {
    if (keys %$port > 5) {
        print "На порту $ip:$port больше 5 маков\n";
    }
}


если нужно ответить на этот вопрос без группировки по ip:
Код

my $port_statistic = {};
while (my ($ip, $port) = each %$hs) {
    $port_statistic->{$port}++;
}
for (my $p (keys %$port_statistic)) {
      if ($port_statistic->{$p} > 5) {
            print "На порту $p больше 5 маков\n";
      }
}


Код не тестировал, но суть такая.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.