So che il blocco BEGIN è compilato ed eseguito prima del corpo principale di un programma Perl. Se non siete sicuri di che basta provare a eseguire il comando perl -cw su questo:Qual è il ruolo del blocco BEGIN in Perl?
#!/ms/dist/perl5/bin/perl5.8
use strict;
use warnings;
BEGIN {
print "Hello from the BEGIN block\n";
}
END {
print "Hello from the END block\n";
}
Mi è stato insegnato che la compilazione precoce e l'esecuzione di un blocco BEGIN permette un programmatore in modo che le risorse necessarie siano disponibili prima di il programma principale viene eseguito.
E così ho utilizzato i blocchi BEGIN per assicurarmi che cose come le connessioni DB siano state stabilite e siano disponibili per l'uso dal programma principale. Allo stesso modo, utilizzo i blocchi END per garantire che tutte le risorse siano chiuse, cancellate, terminate, ecc. Prima che il programma termini.
Dopo una discussione stamattina, mi chiedo se questo sia il modo sbagliato di esaminare i blocchi BEGIN e END.
Qual è il ruolo previsto di un blocco BEGIN in Perl?
Aggiornamento 1: Ho appena scoperto perché la connessione DBI non ha funzionato. Dopo essere stato dato questo piccolo programma Perl:
use strict;
use warnings;
my $x = 12;
BEGIN {
$x = 14;
}
print "$x\n";
quando eseguito la stampa 12.
Aggiornamento 2: Grazie al commento di Eric Strom di sotto di questa nuova versione rende più chiaro:
use strict;
use warnings;
my $x = 12;
my $y;
BEGIN {
$x = 14;
print "x => $x\n";
$y = 16;
print "y => $y\n";
}
print "x => $x\n";
print "y => $y\n";
e l'output è
x => 14
y => 16
x => 12
y => 16
Acceso Di nuovo, grazie Eric!
http://www.compuspec.net/reference/language/perl/BEGIN_and_END.shtml – jantimon
Se questo è il caso, perché non posso creare una connessione a un DBI DB all'interno di un blocco BEGIN utilizzando la funzione DBI connect() standard? Se rimuovo il blocco BEGIN, viene effettuata la connessione –
Per il tuo aggiornamento: questo perché il 'my $ x = 12' dichiara la variabile al momento della compilazione ma non esegue il compito. Quindi viene eseguito il blocco di inizio che assegna 14. Quindi, quando il programma inizia a funzionare, viene eseguito l'assegnazione di 'my' line che ti dà 12. –