Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-07-22 02:40:02

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

[SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Witam

Jak w temacie:
Przykładowa składnia tablicy:
argument1 => polecenie1
argument2=> polecenie2
argument3 => polecenie3

W bashu byłoby to proste, jak konstrukcja cepa:

Kod:

grep warunek <tablica> | wc -l

Tylko ja potrzebuję taie rozwiązanie do znacznie większego skryptu w perlu.
Jest to potrzebne do jednej z kilku funkcji - którą zamierzam umieścić w skrypcie bazującym na tym przykładzie.

Czyli dialplan w SQL -Postgres, a chrakter problemu dobrze widać tutaj.

Docelowo zapytanie do bazy ma wyciągać jeden lub kilka wyników - do tablicy asocjacyjnej, a potem pętla while lub until przy pomocy regexu ma tak długo mielić tablicę, aż uzyska jeden jednoznaczny wynik (dopasowanie klucza).
Prefixy w dialpanie będą miały różne długości, do 2 liczb -krajowe stacjonarne, 0xx kierunkowe międzynarodowe, do np: 069913, i podobnych.

Z tego względu jednym regexem się tego (chyba) zrobić nie da, a do tego czeka mnie kombinowanie, jak wyciąć cyfry od np. 2 do 6  lub od 2 do 8 z ciągu cyfr. :)

Pozdrawiam
;)

Ostatnio edytowany przez Jacekalex (2010-08-01 17:10:28)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#2  2010-07-22 12:14:01

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Przeczytałem to chyba z kilkanaście razy i dalej nie rozumiem co właściwie chcesz osiągnąć i w jakich warunkach.  Napisz to może jeszcze raz, zrozumiale dla innych.

Offline

 

#3  2010-07-22 17:17:19

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Może podam przykład:
dialplan dla centralki freeswitch:
w bazie sql mamy prefiksy i przypisane im sposoby połączenia:
np:
prefix    akcja
032757 tlenofon
037769 actio
032728 skype
032  stacjonarne

i teraz wyciągamy dane z bazy do tablicy asocjacyjnej: argument :

Kod:

 `select from dialplan where prefix like '032%'`

takie zapytanie wyrzuci wszystkie 4 wyniki do tablicy.
a ponieważ numer telefonu to: 0327578978 to kolejną operacją jest dopasowanie klucza w tablicy asocjacyjnej do numeru telefonu - chodzi o najdokładniejsze możliwe dopasowanie.

W tym wypadku mamy 2 możliwości:
1. młócić bazę kolejnymi zapytaniami: w których pytany o 032%, 0327%, 03275%, aż w końcu baza odda jeden wynik. (ciąg cyfr w zapytaniu jest pobrany z numeru telefonu).
jak innego wyjścia nie będzie - to tak kożna - lecz akcja kolejnych odpytań do bazy zajmie znacznie więcej czasu, niż umieszczonej w pamięci RAM tablicy asocjacyjnej.

2. Opcja druga - opisana w pierwszym poście: z bazy X wyników wędruje do tablicy asocjacyjnej, gdzie stosujemy zapytanie np. ^0327(d*) i sprawdzamy - czy jest tylko jeden pasujący klucz.
Jeśli jeden - to stosujemy akcję przypisaną do tego klucza, jeśli więcej niż jeden, to w następnym przejściu pętli stosujemy regexa ^03275(d*), pętla działa tak długo - aż zostaje tylko jeden wynik, stosując w każdym przebiegu pętli ciąg dopasowania o jedną cyfrę dłuższy od poprzedniego.

Krótko pisząc - w bashu część sprawdzajaca liczbę wyników wyglądałaby  tak:

Kod:

grep argument <tablica>| wc  -l

i założenie - że jeśli wyrażenie daje jeden, to akcja, jeśli więcej niż jeden, następne przejście pętli.

Tylko bash nie obrabia tablic asocjacyjnych, a interfejs do freeswitcha można zrobić w perlu lub pythonie.
Z dwojga strasznego, wolę perla, w którym już kilka skryptów napisałem (z Bożą, Ludzką i również Twoją pomocą).  :)


Może się ktoś dziwić - czy problemem są 4 zapytania do bazy - jak w przykładzie.
Ale jeśli to ma być zarządzalne, a wyników zapytania z bazy może być cztery, a może czterdzieści albo i więcej, to młócenie bazy np.  40 zapytaniami spowolni działanie skryptu.
Pewien obraz sytuacyjny jest na tej stronie: http://www.tlenofon.pl/krajowe/
W dodatku - chodzi o połączenie telefoniczne, wiec skrypt musi wybrać operatora tak szybko, jak to możliwe, a szybciej, niż w pamięci RAM, sortować się nie da.

A chodzi o wybranie najdokładniejszego dopasowania, metodą eliminacji.

Inaczej można to nazwać - jak sprawdzić liczbę kluczy w tablicy asocjacyjnej, lub liczę wyników (wierszy?) wyniku filtrowania regexem?

Czy to wystarczające objaśnienie?

Dziękuję za zainteresowanie tematem.
Pozdrawiam
;)

Ostatnio edytowany przez Jacekalex (2010-07-22 17:28:42)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#4  2010-07-22 22:18:27

  lessmian - Użytkownik

lessmian
Użytkownik
Skąd: Kraków
Zarejestrowany: 2009-09-25

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Jacekalex napisał(-a):

jak sprawdzić liczbę kluczy w tablicy asocjacyjnej, lub liczę wyników (wierszy?) wyniku filtrowania regexem?

Tak jak w bashu - grepem
Co za problem zrobić np. tak:

Kod:

#!/usr/bin/perl -l

use strict;
use warnings;

my %hash = (
        'dupa'  => 'dupa_val',
        'dupa8' => 'dupa8_val',
        'foo'   => 'foo_val'
        );

my @match = grep {/dupa/} keys %hash;
my $match = grep {/dupa/} keys %hash;
print "\t$_" foreach @match;
print $match;

W kontekście skalarnym zwróci Ci ilość poprawnych dopasowań, w kontekście listowym otrzymasz listę dopasowanych elementów.

Ostatnio edytowany przez lessmian (2010-07-22 22:46:41)

Offline

 

#5  2010-07-24 13:02:52

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Witam

W kontekście skalarnym zwróci Ci ilość poprawnych dopasowań.....................

Dokładnie o to chodzi. :))))

Jeszcze muszę dopracowac trasę z SQl do %hash,  pętlę i funkje warunkowe - ale z tym raczej obie poradzę.
Najtrudniejsze będzie posklejanie tego w całosć, bo w programowaniu najgorzej mi idzie składnia.

Jeśli istnieje  jakiś program do edycji skryptów perla - który automatycznie uzupełnia średniki nawiasy
i przecinki, to namiar na niego byłby mile widziany.

Bo w geany czegoś takiego nie widzę, a ciele w rodzaju eclipse jest raczej nie dla mnie, zwłaszcza,
że eclipse i inne wielkie kombajny, nawet - jak obsługują perla, to radzą sobie z nim raczej  średnio.

Dziękuję ;)

Ostatnio edytowany przez Jacekalex (2010-07-24 13:22:06)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#6  2010-07-24 13:48:44

  lessmian - Użytkownik

lessmian
Użytkownik
Skąd: Kraków
Zarejestrowany: 2009-09-25

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Co prawda, uważam że najlepszy i tak jest vim, ale może zainteresuje Cię Padre.

Offline

 

#7  2011-10-05 07:20:01

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: [SOLVED][PERL]liczba dopasowań kluczy w tablicy asocjacyjnej?

Jeszcze jedno małe pytanko:

jest sobie tablica:

Kod:

#!/usr/bin/perl -l

use strict;
use warnings;

my %tablica = ("parametr1" => "wart3",
              "parametr2" => "wart2",
              "parametr3" => "wart2",
              "parametr4" => "wart1",
              "parametr5" => "wart3",
              "parametr6" => "wart3"); 

my @match = grep {/wart3/} values %tablica;
print "\t$_" foreach @match;

Jak z niej wyciągnać unikalne wyniki (w tym przykladnie zwraca wynik wart3 3 razy, a ja potrzebuję tylko raz)?

Chodzi dokładnie o wynik taki sam, jak w sortowanie w bashu na przykładzie:

Kod:

cat lista |sort |uniq

To chyba pomoże:
http://search.cpan.org/~jfitz/List-Uniq-0.20/lib/List/Uniq.pm
Ale muszę naprawić perla......

Pozdrawiam
;-)

Ostatnio edytowany przez Jacekalex (2011-10-05 07:49:27)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)