Newsgroup: it.comp.lang.perl
Titolo: subroutines

so che le subroutines vengono richiamate con &Nome_della_sub. In un
programmino in perl (eseguibile da shell) che sto scrivendo, ho posizionato
una sub all'inizio del file (testata da sola e' sintax OK). POi inizio lo
script "main" e richiamo la sub in un flusso controllato da IF a seconda del
valore che assume uno scalare, es.:
..
....
if ($risposta='S')    {
    &Inserimento_dati
        };
....
Sicuramente sbaglio qualcosa perche' al perl -c il risultato e': Can't use
subscript on scalar assignment at line ecc.
Perdonatemi la lameraggine. Grazie a chi vorra' aiutare
Fabio

 Can't use subscript on scalar assignment at line ecc.
  Il problema e` che nel brano di codice da te postato non e` compreso
il punto dove l'errore si verifica, per cui e` difficile capire dove
sbagli.
  Ad ogni modo, il test dell'/if/ e` diverso da cio` che ti aspetti: se
vuoi confrontare due stringhe devi usare l'operatore /eq/ oppure un bind
ad un'espressione regolare.
	Alla prossima,
		Marco

 ha scritto nel messaggio
news:39770563...@bar.va...

Marco,
    la chiamata della sub non funzionava per un semplice syntax error, cmq
    mi sei stato di grande aiuto...e devo anche riconoscere che avevo
intuito la soluzione. Infatti il programma ha cominciato a funzionare quando
ho raffrontato la variabile scalare che immagazzina <STDIN> con il risultato
atteso tramite gli operatori di gestione di stringa, in pratica, per il
mezzi lamer come me, nel controllare un flusso:
..
...
$risp=<STDIN>
if ($risp=~ /s|n/i)    {
        &subroutine
        }
else     {
        print "Fine. Grazie\n"
    }
....
...
Grazie mille ciao,
Fabio

 cerchero` un'altra donna dentro ai sogni di Tarzan...


Si marco, non posso sicuramente essere preso ad esempio per l'eleganza con
cui scrivo il codice. Infatti, la tua versione è molto piu' elegante. Pero'
nella fretta ho sbagliato a trascrivere il mio codice che prevede o l'una o
l'altra risposta, quindi:
<code>
$risp=<STDIN>;
chomp $risp;                 #(questo ad esempio l'avevo tralasciato)
$risp=~ /S|N/i;
if ($risp=~ /s/i)    {
    &subroutine
         }
 elsif ($risp=~ /n/i)    {
        print "Fine programma. Grazie\n"
     }
else {
    print "Si e' immessa una risposta non valida\n"
    };
</code>
...ecco, così avallo la sintassi per quanto riguarda l'eleganza, ribadendo
che per adesso non sono ancora abastanza esperto :(((. Non posso però darti
ragione sulla gestione della stringa in quanto il mio programma così come lo
vedi scritto, funziona: accetta solo "S" (e continua) o "N" e finisce.
Grazie, ciao

 Grazie, ciao
Chiedo scusa....avevi ragione...se la stringa è bhfkjhfkjdfkjssssnnlkkdjf,
il programma funziona lo stesso.....avevi ragione :(((
prendero' provvedimenti e scusa la lameraggine

</code>
Mi pare che comunque non vada bene.
In questo caso se rispondi SN la funzione Regular Expression è
soddisfatta lo stesso. Ho appena verificato.
Alle volte penso che l'eleganza non sia la cosa fondamentale di un
programma, a meno che alla base dell'eleganza non ci siano regole che
rendono per esempio il codice più veloce o più leggibile o più qualche
altra cosa.
Purtroppo in PERL ci sono molti modi per fare le cose, quindi ognuno
può dire la sua.
Ciao
	Pirla
Per rispondere in E-mail the (punto) pirla (chiocciola) 
flashnet.it
*** un bacio ai pupi ***
---> Linux user since yesterday <---

</code>
La mia opinione:
<code>
$_=<STDIN>;
chomp;
$out=/^s$/i?&subroutine:/^n$/i?'Fine programma. Grazie':'Risposta non valida';
print "$out\n" if $out;
sub subroutine {
        print "Faccio qualcosa\n";
        return(0);
}
</code>
-- 
Saluti,
Giancarlo

 può dire la sua.
Vedi il nostro Bisso che e` innamorato dell'operatore ternario ;o)))
BTW non ti obbliga il dottore a usare per forza una regex, soprattutto
se serve solo per il case: potresti benissimo passarla in lowercase ed
andare cosi`.
<STDIN>;
chomp;
$risp = lc($_);
if ($risp eq 'S') {
    &subroutine
} elsif ($risp eq 'N') {
     print "Fine programma. Grazie\n"
} else {
    print "Si e' immessa una risposta non valida\n"
}
volendo usare le regexp avresti:
<STDIN>;
chomp;
if (/^s$/i) {
    &subroutine
} elsif (/^n$/i) {
     print "Fine programma. Grazie\n"
} else {
    print "Si e' immessa una risposta non valida\n"
}
oppure:
<STDIN>;
chomp;
if (/^[sSyY]$/) {
    &subroutine
} elsif (/^[nN]$/) {
     print "Fine programma. Grazie\n"
} else {
    print "Si e' immessa una risposta non valida\n"
}
o ancora:
<STDIN>;
chomp;
&subroutine if /^[sSyY]$/;
print "Fine programma. Grazie\n" if /^[nN]$/;
print "Si e' immessa una risposta non valida\n" unless /^[sSyYnN]$/;
Poi va bene anche il discorso del ternario, ovviamente... Ma IMHO
complica inutilmente la vita, se non si vuole necessariamente un valore
di ritorno: sebbene funzioni anche da struttura di codice if-then-else,
e` comunque una funzione che serve a tornare un valore in base ad una
condizione. Pero` e` elegante, spesso :))
Ora la situazione piu` elegante mi sembra:
<STDIN>;
chomp;
if (/^[sSyY]$/) {
    &subroutine
} else {
     print /^[nN]$/ ?
        "Fine programma. Grazie\n" :
        "Si e' immessa una risposta non valida\n"
}
-- 


}
Devo per caso essere geloso? :)
-- 
Saluti,
Giancarlo

<STDIN>;
A parte gli scherzi.... una nota:
Avevo scritto anche io questa linea, ma poi provando non mi veniva assegnato
nulla a $_, cosi' su due piedi non ricordavo il perche', mi scartabello il buon
vecchio cammello in cerca di una risposta e trovo, pagina 53 "If and only the
line input operator is the only thing inside the conditional of a while loop,
the value is automatically assigned to special variable $_"
Quindi fuori dal while bisogna mettere $_=<>.
-- 
Saluti,
Giancarlo

 if ($risp eq 'S') {
Ovviamente avendo usato lc e non uc avrei dovuto confrontare con 's'
