Sé que el bloque BEGIN se compila y ejecuta antes que el cuerpo principal de un programa Perl. Si no está seguro de que acaba de intentar ejecutar el comando perl -cw sobre esto:¿Cuál es el rol del bloque BEGIN en 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";
}
me han enseñado que la compilación temprana y la ejecución de un bloque BEGIN permite a un programador asegurar que todos los recursos necesarios estén disponibles antes el programa principal se ejecuta.
Y por lo que he estado usando COMENZAR bloques para asegurarse de que cosas como las conexiones de base de datos se han establecido y están disponibles para su uso por el programa principal. De manera similar, utilizo bloques END para asegurarme de que todos los recursos estén cerrados, eliminados, finalizados, etc. antes de que el programa finalice.
Después de una discusión de esta mañana, me pregunto si esto de manera equivocada que mirar BEGIN y END.
¿Cuál es el papel previsto de un bloque BEGIN en Perl?
Actualización 1: Acabo de descubrir por qué la conexión DBI no funcionó. Después de recibir este pequeño programa Perl:
use strict;
use warnings;
my $x = 12;
BEGIN {
$x = 14;
}
print "$x\n";
cuando se ejecuta imprime 12.
Actualización 2: Gracias al comentario de Eric Strom por debajo de esta nueva versión hace que sea más claro:
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";
y la salida es
x => 14
y => 16
x => 12
y => 16
Encendido ¡Otra vez, gracias Eric!
http://www.compuspec.net/reference/language/perl/BEGIN_and_END.shtml – jantimon
Si ese es el caso, ¿por qué no puedo crear una conexión a una DBI DB dentro de un bloque BEGIN usando la función estándar DBI connect()? Si elimino el bloque BEGIN, la conexión se hace –
Para su actualización: eso es porque el 'mi $ x = 12' declara la variable en tiempo de compilación pero no realiza la asignación. Luego comienza el ciclo de ejecución que asigna 14. Luego, cuando el programa comienza a ejecutarse, la asignación de la línea 'my' se ejecuta y le da 12. –