Newsgroup: it.comp.lang.perl
Titolo: Chiamare una funzione tramite scalare.

Sono un neofita pasticcione, e mi sono intestardito nel voler chiamare delle
"subroutines" utilizzando il contenuto di una variabile scalare (es..
&$menu("$mele","$pere",ecc...)). Ho scoperto cento modi per non farlo
funzionare...
Potreste suggerirmi il giusto modo per farmi capire dal perl?
Sto utilizzando perl 5.6.1 sotto cygwin.
Ringrazio anticipatamente quanti possano suggerirmi la giusta sintassi.
 
 
 

 Potreste suggerirmi il giusto modo per farmi capire dal perl?
 
Secondo me la cosa migliore č usare una dispatch table:
 
http://en.wikipedia.org/wiki/Dispatch_table
 
 
ovvero
 
- crei un hash del tipo
 
my %dispatch = (
 
   'pippo' => sub {  return "Ciao pippo\n"; }, # sub anonima
   'saluta' => \&saluta,
);
 
sub saluta {
 
	my $nome = shift;
	return "Ciao $nome\n";
}
 
 
- poi usi le chiamate cosě:
 
print $dispatch{'pippo'}->(); #nessun argomento
print $dispatch{'saluta'}->('tek');

 print $dispatch{'saluta'}->('tek');
 
Avevo già esaminato tale procedura, ma non l'ho ancora metabolizzata per cui 
mi avvalgo di vecchi miei rudimenti e per maggior chiarezza posto una 
piccola porzione di codice in cui credo risulti evidente la mia richiesta.
.
.
.
    if ($AGI{callerid} =~ m/$Operatori/) {$TipoTel = 1234}
    if ($AGI{context}=~ m/$Servizi/) {$TipoTel = 123}
    if ($DEBUG >= 5) {print DEBUGOUT "**** Menu Operatore/Servizi => 
$TipoTel\n"}
    my $Loop = 2;
    my $Menu = '';
    while ($Menu eq '') {
        my $sel = 0;
        if ($Loop <= 0) {return}
        $sel = Riproduci($SOUNDS . 'PerLaSveglia',"$TipoTel");
        if ($sel == 0) {$sel = Riproduci($SOUNDS . 
'PremiTasto-1',"$TipoTel")}
        if ($sel == 0) {$sel = Riproduci($SOUNDS . 'PerLaLista',"$TipoTel")}
        if ($sel == 0) {$sel = Riproduci($SOUNDS . 'O',"$TipoTel")}
        if ($sel == 0) {$sel = Riproduci($SOUNDS . 
'PerCancEvento',"$TipoTel")}
        if ($sel == 0) {$sel = Riproduci($SOUNDS . 
'PremiTasto-2',"$TipoTel")}
        if ($sel == 0 && $TipoTel != 12) {$sel = Riproduci($SOUNDS . 
'PerImpostProm',"$TipoTel")}
        if ($sel == 0 && $TipoTel != 12) {$sel = Riproduci($SOUNDS . 
'PremiTasto-3',"$TipoTel")}
        if ($sel == 0) {$sel = get_choice()}
        if ($sel != 0) {$sel = ascii2num($sel)}
        if ($sel == 1) {$Menu = 'Sveglia'}
        if ($sel == 2) {$Menu = 'Amministra'}
        if ($sel == 3 && $TipoTel != 12) {$Menu = 'Promemoria'}
        if ($sel == 4 && $TipoTel == 1234) {$Menu = 'Test'}
        if (($sel >= 3 && $TipoTel == 12) || ($sel >= 4 && $TipoTel == 123) 
|| $sel >=5){Riproduci($SOUNDS . 'InsErrato','');
        if ($Loop > 0) {Riproduci($SOUNDS . 'PregoRiprovi','')}
    }
    -- $Loop;
}
if ($Menu eq 'Promemoria' || $Menu eq 'Sveglia') 
{Differita("$TipoTel","$Menu")}
elsif ($Menu eq 'Test') {Test($TipoTel)}
elsif ($Menu eq 'Amministra') {Amministra($TipoTel)}
return;
 
Se potessi utilizzare direttamente lo scalare "$Menu" del ciclo "while" per 
indirizzare le "subroutines" otterei l'eliminazione delle ultime tre righe 
di codice rendendo ai miei occhi la procedura più intuitiva. (Forse 
nostalgia per i "goto").
Nel mentre ti rispondo un'e-mail di un mio amico mi ha segnalato un'analoga 
richiesta in cui si dice che "&$Menu" funziona a patto di non lavorare con 
"use strict;" condizione che io forzo per garantire la massima compatibilità 
del codice dato l'ambiente "Asterisk" su cui deve operare. Restio a credere 
che ciò non sia corretto ritengo che molto probabilmente con un sapiente uso 
di parentesi apostrofi punti o virgolette (cose ancora molto oscure per me) 
la cosa possa funzionare.
Ti ringrazio per il tuo suggerimento e chissà...
Ciao
 
 
 
 

>CUT<

Rispondo a me stesso, :)
la soluzione era sotto il mio naso, bastava ingnorare la condizione "while" 
e chiamare direttamente le "sub" un'aggiustatina alle variabili $Loop e 
tutto ha funzionato e posso proseguire.
Spesso non serve drogarsi per sballare... è già nella natura umana.