2011-02-04 14 views
7

Chciałbym mieć skrót zawierający odniesienia do podfunkcji, gdzie mogę je nazwać zależnymi od zmiennej zdefiniowanej przez użytkownika, postaram się dać uproszczony przykład tego, co próbuję zrobić.Hash Perla podprogramów

my %colors = (
    vim => setup_vim(), 
    emacs => setup_emacs(), 
) 

$colors{$editor}(arg1, arg2, arg3) 

gdzie setup_vim() i setup_emacs() byłoby podrzędne funkcje zdefiniowane później w moim pliku i $editor jest zdefiniowane przez użytkownika zmienna a (tj vim lub emacs). czy to możliwe? Nie mogę sprawić, żeby działało, lub znaleźć dobre informacje na ten temat. Dzięki.

(Uwaga mam go teraz realizowane jako przełącznik pracy, ale myślę, że hash jak wyżej by ułatwić dodawanie nowych wpisów do mojego istniejącego kodu)

Odpowiedz

16

Oto składnia.

my %colors = (
    vim => \&setup_vim, 
    emacs => \&setup_emacs, 
); 

$colors{$editor}(@args) 

Zauważ, że rzeczywiście można tworzyć funkcje bezpośrednio z

my %colors = (
    vim => sub {...}, 
    emacs => sub {...}, 
); 

A jeśli jesteś zaznajomiony z zamknięciami, Perl obsługuje pełne zamknięć dla zmiennych, które zostały uznane leksykalnie, co można zrobić z moim .

+0

Dziękuję wam obu, ale wszystko działa dobrze. Nie jestem pewien, jakie są zamknięcia, ja sam się uczę Perla czytając Mastering Perl (Foy) i są one oddalone o 2-3 rozdziały :) –

+0

Zamknięcia działają również na inne rodzaje zmiennych leksykalnych, nie tylko na te tworzone za pomocą '' '' mój ". – tchrist

+0

@tchrist: Tak, zamknięcia działają ze wszystkimi zmiennymi leksykalnymi. Ale rzeczy, które ludzie chcą z nich korzystać, nie są tak oczywiste z naszymi zmiennymi. Wciąż mam zaktualizowaną odpowiedź. – btilly

3

Musisz podać referencję do podprogramu, do którego chcesz zadzwonić.

Oto przykład:

sub myFunc { 
    print join(' - ', @_); 
} 

my %hash = (key => \&myFunc); 
$hash{key}->(1,2,3); 

Z \ & myFunc dostaniesz punkty Wich referencyjna funkcji. Ważne jest, aby opuścić(). W przeciwnym razie przejdziemy przez odniesienie do wartości zwracanej przez funkcję.

Podczas wywoływania funkcji przez odniesienie trzeba usunąć ją za pomocą operatora ->.

+0

" Podczas wywoływania funkcji przez odwołanie, musisz usunąć ją za pomocą operatora ->. " Fałszywy. –

+0

@ Chris: To było kiedyś prawdziwe. Teraz nie jest. – tchrist

+0

@tchrist - Prawda. To nieprawda, odkąd nauczyłem się Perla (trzy lata?). –

Powiązane problemy