2012-06-20 14 views
5


W Perl, jesteś w stanie wywołać funkcję przez odniesienie (lub nazwisko) tak:Perl: Problemy wywołanie podprogramów przez odniesienie używając wartości hash

my $functionName = 'someFunction'; 
    &$functionName(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

Co usiłuję zrobić jest użycie wartość z skrótu, tak:

my %hash = (
     functionName => 'someFunction', 
    ); 

    &$hash{functionName}(); 

    #someFunction defined here: 
    sub someFunction { print "Hello World!"; } 

A błąd, który otrzymuję, to globalny symbol "$ hash" wymaga jawnej nazwy pakietu.

Moje pytanie brzmi: czy istnieje sposób, aby to zrobić bez użycia zmiennej pośredniej?
Każda pomoc w tej sprawie byłaby bardzo ceniona!

+3

Możesz także wykonać 'mój% hash = (function => \ & someFunction)' który nie wymaga 'no stric t 'refs''. – TLP

+0

@ TLP +1, miałem zamiar * odpowiedzieć na to. 'use strict;' zapisuje ** więc ** wiele problemów ... – Dallaylaen

+0

Jestem w stanie tego użyć, ale dodaje trochę nieczytelnego kodu (na razie) ... Dynamicznie ustawiam wartość functionName w czasie wykonywania i wywoływanie funkcji według jej nazwy. Perl jest świetny! – Thumper

Odpowiedz

12

To tylko kwestia pierwszeństwa, którą można rozwiązać, nie pomijając curlies. Można użyć

&{ $hash{functionName} }() 

Albo użyć alternatywną składnię:

$hash{functionName}->() 

Jako pomiędzy wskaźników, -> można zrezygnować (ale nie pomijać go tutaj):

$hash{functionName}() 

Odniesienie: Deferencing Syntax

+0

Wow, to jest pierwsze pytanie, jakie tutaj zadałem, i oczekiwałem długiego oczekiwania. Dziękuję bardzo! Skończyło się na tym, że skorzystałem z pierwszego wysłanego przez ciebie rozwiązania. Świetne rzeczy! Dziękuję bardzo. – Thumper

+0

Ponadto, zapomniałem wspomnieć, że jestem całkiem nowy w Perlu (może miesiąc doświadczenia), więc to naprawdę pomoże mojemu rozwojowi zawodowemu. – Thumper

+1

Jestem trochę zaskoczony, ponieważ większość ludzi uważa, że ​​notacja strzałkowa jest najbardziej czytelna, ale obie są do przyjęcia. – ikegami

Powiązane problemy