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/urandom
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 [url=http://wiki.freeswitch.org/wiki/Perl_DialPlan_Executor_Example]tym[/url] przykładzie.

Czyli dialplan w SQL -Postgres, a chrakter problemu dobrze widać [url=http://www.tlenofon.pl/krajowe/]tutaj[/url].

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: Brno, Česko
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.


Spinnen Essen: [url=http://fluxboxpl.org/portal/]FluxboxPL[/url] [url=http://przepis-na-lo.pl/]Przepis na LibreOffice[/url]

Offline

 

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

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
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 [b]032%[/b], [b]0327%[/b], [b]03275%[/b], 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. [b]^0327(d*)[/b] 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 [b]^03275(d*)[/b], 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?

[quote=Jacekalex]jak sprawdzić liczbę kluczy w tablicy asocjacyjnej, lub liczę wyników (wierszy?) wyniku filtrowania regexem?[/quote]
Tak jak w bashu - [url=http://perldoc.perl.org/functions/grep.html]grepem[/url]
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/urandom
Zarejestrowany: 2008-01-07

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

Witam

W kontekście skalarnym zwróci Ci ilość poprawnych dopasowań.....................[/quote]
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ę [url=http://padre.perlide.org/]Padre[/url].

Offline

 

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

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
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 [b]wart3[/b] 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
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.008 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00093 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.218.108.24' WHERE u.id=1
0.00059 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.218.108.24', 1732328808)
0.00044 SELECT * FROM punbb_online WHERE logged<1732328508
0.00046 SELECT topic_id FROM punbb_posts WHERE id=182538
0.00144 SELECT id FROM punbb_posts WHERE topic_id=17255 ORDER BY posted
0.00060 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=17255 AND t.moved_to IS NULL
0.00012 SELECT search_for, replace_with FROM punbb_censoring
0.00080 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=17255 ORDER BY p.id LIMIT 0,25
0.00078 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=17255
Total query time: 0.00629 s