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 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)
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 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:
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
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:
#!/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ń.....................
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)
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 wart3 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