Non è proprio una funzione. Restituisce il valore dell'ultimo
comando nella sequenza dei comandi indicati da BLOCCO. Quando viene
modificato da un modificatore di ciclo while o until, esegue il BLOCCO
una volta prima di testare la condizione del ciclo (Su altre istruzioni, i
modificatori di loop testano prima il condizionale).
do BLOCCOnon conta come un ciclo, dunque le istruzioni di
controllo del ciclo next, last o redo non possono essere usati
per lasciare o ricominciare il blocco. Consultate perlsyn per strategie
alternative.
do SUBROUTINE(LISTA)
Questa formadi chiamata a subroutine è deprecata. Consultate perlsub.
do ESPR
Utilizza il valore di ESPR come un nome di file ed esegue il contenuto del
file come fosse uno script Perl.
do 'stat.pl';
è proprio come
eval `cat stat.pl`;
eccetto che è più efficiente e concisa, tiene traccia del
nome file corrente per i messaggi d'errore, ricerca directory di @INC e
aggiorna %INC se il file viene trovato. Consultate
perlvar/Predefined Names [Nomi predefiniti, NdT] per queste varabili.
Differisce anche per il fatto che il codice valutato con do NOMEFILE
non può vedere i lessicali nello scope che lo include;
eval STRINGA li vede. È lo stesso, comunque, nel fatto che esso
riesegue un'analisi sintattica del file ogni qualvolta viene chiamato,
dunque probabilmente non volete fare questo all'interno di un ciclo.
Se do non può leggere il file, esso restituisce undef e imposta
$! con l'errore. Se do può leggere il file ma non lo può
compilare, restituisce undef e imposta un messaggio di errore in $@. Se il
file è compilato con successo, do restituisce il valore dell'ultima
espressione valutata.
Va notato che l'inclusione di moduli di libreria viene fatta meglio con gli
operatori use e require che eseguono anche un controllo automatico
degli errori e sollevano un'eccezione se ci fosse un problema.
Potreste gradire l'utilizzo di do per leggere in un file di configurazione
di un proramma. Il controllo manuale degli errori può essere fatto in
questo modo:
# legge nei file di configurazione: prima in quelli di sistema poi in quelli utente
for $file ("/share/prog/default.rc",
"$ENV{HOME}/.unqualcheprogrammarc")
{
unless ($valore_restituito = do $file) {
warn "non si e` potuto fare l'analisi sintattica di $file: $@" if $@;
warn "non si e` potuto eseguire do sul $file: $!" unless defined $valore_restituito;
warn "non si e` potuto eseguire il $file" unless $valore_restituito;
}
}
mongers@perl.it è la lista ufficiale di Perl Mongers Italia per
porre quesiti di tipo tecnico, per rimanere aggiornato su meeting,
incontri, manifestazioni e novità su Perl.it. Iscriviti!