Moduł Symbol::Approx::Sub

Uniwersytet Gdański - Instytut Matematyki - Zakład Informatyki - Strona domowa

Co to jest?

Moduł perlowy do wywoływania funkcji po przybliżonych nazwach.

Streszczenie
use Symbol::Approx::Sub; sub a { # coś... } &aa; # wykonuje &a jeśli &aa nie istnieje. use Symbol::Approx::Sub (xform => 'Text::Metaphone'); use Symbol::Approx::Sub (xform => undef, match => 'String::Approx'); use Symbol::Approx::Sub (xform => 'Text::Soundex'); use Symbol::Approx::Sub (xform => \&my_transform); use Symbol::Approx::Sub (xform => [\&my_transform, 'Text::Soundex']); use Symbol::Approx::Sub (xform => \&my_transform, match => \&my_matcher, choose => \&my_chooser);

Ten moduł pozwala wywoływać funkcje po ich przybliżonych nazwach. Czemu kiedykolwiek chciałbyś robić coś takiego jest dla mnie zupełną zagadką. Został napisany jako eksperyment aby sprawdzić jak dobrze rozumiem typeglobs i auto ładowanie. Moduł ten może się przydać w sytuacji, gdy to użytownik podaje nazwę funkcji do wykonania, i nie można polegać na tym, że poda on nazwę prawidłowo (np. inwalidzi, itp.). W takim zastosowaniu program ten daje szanse wykonania czegokolwiek zamiast wyprowadzenia komunikatu błędu (przyp. P.A.)

Poprzez określenie "przybliżone nazwy" mamy na myśli nazwy o podobnej składni. Na przykład przy ustawieniach domyślnych: jeśli wywołamy funkcje o nazwie a a nie istnieje funkcja o dokłanie takiej nazwie. Moduł ten zacznie przetwarzać nazwę aby znaleźć przybliżoną może to być równie dobrze aaa,a_aa, AA, A, AAA_A. Określenie "przybliżona" zależne jest również od ustawień jakie dostarczymy dla samego modułu. Sami możemy określić co oznacza dla nas wyraz "przybliżona".

Aby go używać po prostu dołącz linie:

use Symbol::Approx::Sub;

gdzieś w swoim programie. Wtedy za każdym razem jak wywołasz funkcje która nie istnieje ten pakiet będzie szukał funkcji z przybliżoną nazwą. Znaczenie "przybliżoną" jest konfigurowalne. Domyślnie jest wyszukiwanie funki o takiej samie wartości Soundex (jak to jest zdefiniowane w Text::Soundex) jak brakująca funkcja. Pozostałe dwa wbudowane style doboru używa Text::MetaPhone oraz String::Approx. Aby użyć któryś z tych należy:

use Symbol::Approx::Sub (xform => 'text_metaphone');

albo

use Symbol::Approx::Sub (xfrom => undef,match => 'string_approx');

kiedy używamy Symbol::Approx::Sub.

Konfiguracja

Są trzy fazy procesu doboru. Są to:

transform

Funkcja transform stosuje pewien sposób transformacji nazwy funkcji. Na przykład domyślny transformator stosuje algorytm Soundex dla każdej nazwy. Inną oczywistą transformacja było by usunięcie wszystkich podkreśleń albo zmiana nazwy na małe litery.

Funkcja transform powinna po prostu zastosować tą transformacje dla każdej pozycji listy jego parametru oraz zwraca listę przetransformowaną. Dla przykładu, transformacja która usunęła podkreślniki jej parametrów wyglądała by w taki sposób:

sub tranformer { map { s/_//g; $_ } @_; }

Funkcje transformujące mogą zostać połączone.

match

Funkcja match tworzy docelowy napis oraz listę z innych napisów. Dopasowuje każdy napis z celem oraz ustala czy pasuje czy nie w stosunku do kryteriów. Dla przykładu domyślny "sprawdzacz" po prostu sprawdza czy napisy są równe.

Funkcja match pobiera docelowy napis jako pierwszy parametr, po niej lista potencjalnych trafień. Dla każdego napisu który pasuje, "sprawdzacz" powinien zwrócić numer indeksu z listy wejściowej. Dla przykładu domyślny "sprawdzacz" (matcher) jest zaimplementowany w taki sposób:

sub matcher { my ($sub, @subs) = @_; my (@ret); foreach (0 .. $#subs) { push @ret, $_ if $sub eq $subs[$_]; } @ret; }
choose

Funkcja choser bierze listę dopasowań i wybiera dokładnie jedną z nich. Domyślnie wybiera jeden element przypadkowo.

Funkcja chooser pobiera listę dopasowań i musi po prostu zwrócić jeden numer indeksu z listy. Dla przykładu domyślny chooser jest zaimplementowany w taki sposób:

sub chooser { rand @_; }

Możesz nadpisać każde z tych zachowań, pisząc swój własny transformer, matcher lub chooser. Możesz równie dobrze zdefiniować funkcje w swoim własnym skrypcie, bądź też umieścić funkcje w oddzielnym module Symbol::Approx::Sub który możesz wykorzystać jako plugin. Zobacz niżej aby zapoznać się z detalami pluginów.

Aby używać swojej własnej funkcji, po prostu przekaż wskaźnik do funkcji aby użyć Symbol::Approx::Sub w ten sposób:

use Symbol::Approx::Sub( xfrom => \&my_transform, match => \&my_matcher, choose => \&my_chooser );

Plugin jest po prostu modułem który żyje w przestrzeni nazw Symbol::Approx::Sub. Dla przykładu, jeśli mamy linie taką linie kodu:

use Symbol::Approx::Sub(xfrom => 'MyTransform');

wtedy Symbol::Approx::Sub będzie próbował załadować moduł nazywający sie Symbol::Approx::Sub::MyTranform i będzie używał funkcji z wnętrza tego modułu nazywającą się transformer jako funkcje transformującą. Tak samo funkcje, dopasowującą nazywamy match a funkcje wybierającą nazywamy choose.

Domyślnie transformer, matcher oraz chooser są dostępne jako pluginy nazwane Text::Soundex, String::Equal oraz Random.

Funkcje

import
Wywoływane kiedy moduł jest użyty. Ta funkcja instaluje twoją funkcje AUTOLOAD.

Dodatkowe informacje.

Moj przykładowy program:
use Symbol::Approx::Sub; sub aaaa{ print "funkcja aaaa\n"; } sub BBB{ print "funkcja BBB\n"; } sub C__cc{ print "funkcja C__cc\n"; } sub DDDAC{ print "funkcja DDDAC\n"; } &a; &b; &c; &d;

Program ten wyświetli:

funkcja aaaa funkcja BBB funkcja C__cc REALLY Undefined subroutine main::d called at sub.pl line 11

Oznacza to że moduł Symbol::Approx::Sub był w stanie odnaleźć nazwy dla 3 pierwszych funkcji, jednak nie dał rady przetworzyć nazwy d na DDDAC. Oczywiście moduł działał w domyślnym trybie. Przy odpowiednim doborze transformer, matcher oraz chooser zapewne był by w stanie również tą funkcje wywołać.

Przydatne linki

Dokumentacja tego modułu w cpan'ie
Jeszcze więcej dokumentacji

Od autora

Nie stresuj sie zbytnio że ten moduł sprawi że twój kod stanie się zupełnie nieczytelny oraz nie da się go później podtrzymywać, nie powinieneś w ogóle użwać tego modułu chyba że robisz coś bardzo głupiego.

Kontakt i informacje o autorze opracowania

Autor modułu:

Dave Cross z pomocą Leona Brocarda.

Autor przekładu: MD

Numer GG: Słoneczko 2194164

Uniwersytet Gdański - Instytut Informatyki - Strona domowa - Perl - Wyklady
[c] Piotr Arłukowicz, materiały z tej strony udostępnione są na licencji GNU.