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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Witam
Jak w temacie:
Przykładowa składnia tablicy:
argument1 => polecenie1
argument2=> polecenie2
argument3 => polecenie3
W bashu byłoby to proste, jak konstrukcja cepa:
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)
Offline
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
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 :
`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:
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)
Offline
[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:
#!/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
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
Co prawda, uważam że najlepszy i tak jest vim, ale może zainteresuje Cię [url=http://padre.perlide.org/]Padre[/url].
Offline
Jeszcze jedno małe pytanko:
jest sobie tablica:
#!/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:
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)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00015 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00090 | 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='3.149.25.117' WHERE u.id=1 |
0.00110 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.149.25.117', 1732340472) |
0.00061 | SELECT * FROM punbb_online WHERE logged<1732340172 |
0.00089 | SELECT topic_id FROM punbb_posts WHERE id=152350 |
0.00187 | SELECT id FROM punbb_posts WHERE topic_id=17255 ORDER BY posted |
0.00094 | 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.00006 | SELECT search_for, replace_with FROM punbb_censoring |
0.00098 | 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.00133 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=17255 |
Total query time: 0.00887 s |