Replies (43)

  • @norguhtar, Так же сильно как и русский?
  • @DarthRamone,
    Когда мне приходится писать вот такие вот конструкции
    @{$request->{@row[0]}->{@row[2]}} = @row[3];

    мне хочется сильно перебать в щи тех людей кто это придумал.
    А тут еще выясняется что вместо массива параметров туда надо класть строку в массив ну охуеть теперь
  • @norguhtar,
    there is more than one way to do it
    Когда мне приходится писать
    переебать в щи тех людей кто это придумал
  • @DarthRamone, окей. Предложи более красивый метод. И так чтобы это не напоминало птичий язык. Perl выкинуть увы нельзя.
  • @norguhtar,
    Не-е, мне лень, да и не до этого. Отмазка, ага, let it be.
  • @norguhtar, Судя по "@row[0]" это либо perl6, либо человек не знает perl5. Скорее второе.
  • @norguhtar, расскажи как мне сделать лучше. Я переделаю. Я вот почитал как делается доступ и увы другого варианта не придумал.
  • @norguhtar, Ну ты линк-то на оригинальный код дал бы.
  • @freefd, Тут вот пример структур. Я читаю из СУБД данные в том виде которые их хочет FreeRADIUS далее размещаю в RADIUS пакет как тут
    cpansearch.perl.org
    И отправляю на NAS как CoA или Disconnect Request
  • @norguhtar, И где тот код, который был выше?
  • @freefd, тебе весь скрипт или часть?
  • @norguhtar, Мне понять откуда там такой ад, потому что в скрипте по ссылке все вполне корректно. Ну разве что разыменование можно стоило бы делать через %{$rsp}.
  • @freefd, в скрипте по ссылке корректно, так-как в нем данные из СУБД не берутся и не колбасятся в такой же список

    $sth = $dbh->prepare("select * from aaa.coa_reply(?,?,now()::timestamp);");
    $sth->execute($sid,$requesttype);

    while (@row = $sth->fetchrow_array()) {
    push @{$request->{@row[0]}->{@row[2]}}, @row[3];
    }

    Внутри запроса:

    0 | test | User-Name | test | +=
    0 | test | Acct-Session-Id | FF16001A6800D521-5082FB2E | +=
    0 | test | NAS-IP-Address | 10.255.2.18 | +=
    2352 | test | Dynamic-QoS-Param | police-class-rate cls-local rate-absolute 10240 | +=
    2352 | test | Dynamic-QoS-Param | police-class-burst cls-local 1310720 | +=
    2352 | test | Dynamic-QoS-Param | meter-class-rate cls-local rate-absolute 10240 | +=
    2352 | test | Dynamic-QoS-Param | meter-class-burst cls-local 1310720 | +=
    2352 | test | Dynamic-QoS-Param | police-class-rate cls-inet rate-absolute 10240 | +=
    2352 | test | Dynamic-QoS-Param | police-class-burst cls-inet 1310720 | +=
    2352 | test | Dynamic-QoS-Param | meter-class-rate cls-inet rate-absolute 10240 | +=
    2352 | test | Dynamic-QoS-Param | meter-class-burst cls-inet 1310720 | +=

    А дальше разворачиваем это все внутрь массива аналогичного в скрипте. Это атрибуты радиуса что надо отдать.
  • @norguhtar, А... Так это привет от DBI? :) Там есть fetchrow_hashref, которую можно использовать вместо fetchrow_array.
  • @freefd, и чем это поможет? :) У меня что {} меньше станет? Или там не знаю вместо [0] будет написано {'attriubte'} ?
  • @norguhtar, Выполни

    use Data::Dumper;
    $sth = $dbh->prepare("select * from aaa.coa_reply(?,?,now()::timestamp);");
    $sth->execute($sid,$requesttype);

    while ($ref = $sth->fetchrow_hashref()) {
    print Dumper(\$ref);
    }

    Что покажет вывод?
  • @freefd,
    $VAR1 = {
    'attribute' => 'Dynamic-QoS-Param',
    'value' => 'police-class-rate cls-local rate-absolute 40960',
    'id' => '2352',
    'op' => '+=',
    'username' => 'test'
    };
    $VAR1 = {
    'attribute' => 'Dynamic-QoS-Param',
    'value' => 'police-class-burst cls-local 5242880',
    'id' => '2352',
    'op' => '+=',
    'username' => 'test'
    };

    и т.п.
  • @norguhtar, Ну, вот тебе и $ref{attribute} :)
  • @freefd, ну и будет вместо {@row[2]}} {$ref{'value'}}} как был синтаксически крокодил так и будет :)
  • @norguhtar, Точнее $ref->{attribute}, потому что потому что это ссылка на объект.
  • @norguhtar, Будет УДОБНО, а не игра с массивами в паскале. Синтаксис тут совершенно не причём.
  • @freefd, я тут больше ругаюсь не на массивы как таковые, а на совершенно крокодилий синтаксис. На любом другом языке такое преобразование не будет иметь такого адового количества скобочек
  • @norguhtar, Я тебе уже показал как от них избавиться, не?
  • @freefd, В замен строка лучше не будет :) Давай я сейчас переколбашу на hash и покажу для сравнения.
  • @norguhtar, Давай, а я постараюсь ещё упростить. Но это после ванны :)
  • @freefd, было
    push @{$request->{@row[0]}->{@row[2]}}, @row[3];

    стало
    push @{$request->{$ref->{'id'}}->{$ref->{'attribute'}}}, $ref->{'value'};

    былк крокодил и остался крокодил :)
  • @norguhtar, А зачем ты собираешь массив предварительно? Что тебе мешает выполнять запросы на ходу прямо из while ($ref = $sth->fetchrow_hashref()) ?
  • @freefd, не понял вопроса.
  • @freefd, а все сообразил. Сначала надо собрать массив, дальше его отправить запросом. По этому предварительно надо его собрать
  • @norguhtar, А сразу из while его нельзя выполнять? :)
  • @freefd, Это запрос к RADIUS серверу. Там пакет строится. Он один.
  • @norguhtar, То есть много row — это всего лишь один запрос?
  • @freefd, Да. Собираешь массив, дальше отдаешь в клиент и говоришь отправить, в рамках протокола это один пакет. По этой причине и приходится собирать массив.
  • @norguhtar, Хорошо, в этом случае selectall_hashref:

    my $friend_hash = $dbh->selectall_hashref('SELECT * FROM friends', 'id');


    $VAR1 = {
    '1' => {
    'id' => 1,
    'age' => 15,
    'last_name' => 'Smith',
    'first_name' => 'Joe'
    },
    '3' => {
    'id' => 3,
    'age' => 33,
    'last_name' => 'Jansen',
    'first_name' => 'Stuart'
    },
    '2' => {
    'id' => 2,
    'age' => 25,
    'last_name' => 'Johnson',
    'first_name' => 'Roger'
    }
    };

    search.cpan.org
  • @freefd, к сожалению провал в конецепции. Там помнишь циферки в id? По ним надо группировать. Вообщем судя по всему по другому это изящно не сделать. Максимум сделать код более читаемым.
  • @norguhtar, Добавь в таблицу уникальное поле для всех row одного запроса. selectall_hashref умеет принимать имя этого поля, которое и будет ключом в хеше хешей.
  • @freefd, не понял. Это как?
  • @freefd, если сказать $sth->fetchall_hashref('id'); отдает ерунду.
  • @norguhtar, У тебя есть много строк в таблице с одинаковыми id. Чтобы fetchall_hashref умел из них собрать один хеш, тебе надо какой-то ключ ему передать, который будет уникальным в пределах всей таблицы и при этом будет описывать n количество строк как один связный объект. По этому полю fetchall_hashref и будет считать эти строки как один хеш.
  • @freefd, не получится. Вот что должно быть на выходе:

    $VAR1 = {
    '2352' => {
    'Dynamic-QoS-Param' => [
    'police-class-rate cls-local rate-absolute 40960',
    'police-class-burst cls-local 5242880',
    'meter-class-rate cls-local rate-absolute 40960',
    'meter-class-burst cls-local 5242880',
    'police-class-rate cls-inet rate-absolute 40960',
    'police-class-burst cls-inet 5242880',
    'meter-class-rate cls-inet rate-absolute 40960',
    'meter-class-burst cls-inet 5242880'
    ]
    },
    '0' => {
    'User-Name' => [
    'test'
    ],
    'Acct-Session-Id' => [
    'FF16001A68003D29-507F4690'
    ],
    'NAS-IP-Address' => [
    '10.255.2.18'
    ]
    }
    };
  • @norguhtar, Ты не видишь дальше возможности. Как только у тебя будет получаться грепать многострок в один хеш — дальше ты уж сможешь конструировать свои хеши в правильном виде. Вывод из таблицы это будет всё равно промежуточным результатом, но конструктор приобретёт более удобный вид, нежели "push @array и вдруг дальше повезёт" :)
  • @freefd, скажем пока я не придумал пока по какому ключу это грести
  • @norguhtar, Тогда у меня ванна :)