teclado sintaxis por open manejo linea entrada crear copiar con comandos array archivos perl

sintaxis - perl stdin



En Perl, ¿es mejor usar un módulo que requerir un archivo? (4)

El uso del use del módulo incluirá el módulo durante el tiempo de compilación, lo que aumenta la velocidad pero utiliza más memoria, mientras que el uso require módulo se incluirá durante el tiempo de ejecución. Requerir un módulo sin usar importar cuando sea necesario usa menos memoria pero reduce la velocidad.

Otra pregunta me hizo pensar en diferentes métodos de reutilización de código: use vs. require vs.

Veo muchos mensajes aquí donde la pregunta se centra en el uso de require para cargar y ejecutar código. Esto me parece una mala práctica evidente, pero no he encontrado ningún recurso bueno sobre el tema que pueda señalar a la gente.

perlfaq8 cubre la diferencia entre use y require , pero no ofrece ningún consejo con respecto a la preferencia (a partir de 5.10 - en 5.8.8 hay un consejo rápido a favor del uso ).

Este tema parece sufrir por la falta de discusión. Tengo algunas preguntas que me gustaría ver discutidas:

  1. ¿Cuál es el método preferido de reutilización de código en Perl?
    • use ModuleName;
    • require ModuleName;
    • require ''file.pl'';
    • do ''file.pl'';
  2. ¿Cuál es la diferencia entre require ModuleName y require "file.pl" ?
  3. ¿Alguna vez es una buena idea usar require "file.pl" ? ¿Por qué o por qué no?

Existe una gran preferencia por el use , ya que ocurre en un estado anterior BEGIN {} durante la compilación, y los errores tienden a propagarse al usuario en un momento más apropiado. También llama a la función sub import {} que le da control al que llama sobre el proceso de importación. Esto es algo que se usa mucho. Puede obtener el mismo efecto, llamando a la import del espacio de nombre específico, pero eso requiere que conozca el nombre del espacio de nombres y el archivo, y que codifique la llamada a la subrutina ... lo cual es mucho más trabajo. Por el contrario, use , solo requiere que conozca el espacio de nombres, y luego requiere el archivo con el espacio de nombres correspondiente, lo que hace que el vínculo entre los espacios de nombres y los archivos sea menos consciente para el usuario.

Lea perldoc -f use , y perldoc -f require , para más información. Per perldoc -f use :
use es el mismo que BEGIN { require Module; Module->import( LIST ); } BEGIN { require Module; Module->import( LIST ); } BEGIN { require Module; Module->import( LIST ); } Lo cual es mucho más feo.


La práctica estándar es usar el use mayor parte del tiempo, require ocasionalmente y do raramente.

do ''file'' ejecutará el file como un script de Perl. Es casi como llamar a eval en el contenido del archivo; si do el mismo archivo varias veces (por ejemplo, en un bucle), se analizará y evaluará cada vez que es poco probable que sea lo que deseas. La diferencia entre do y eval es que do puede ver las variables léxicas en el ámbito adjunto, lo que lo hace más seguro. do es de vez en cuando útil para tareas simples como procesar un archivo de configuración que está escrito en forma de código Perl.

require ''file'' es como do ''file'' excepto que solo analizará un archivo en particular una vez y generará una excepción si algo sale mal. (por ejemplo, el archivo no se puede encontrar, contiene un error de sintaxis, etc.) La comprobación automática de errores lo convierte en un buen reemplazo para do ''file'' pero todavía es adecuado para los mismos usos simples.

Los do ''file'' y require ''file'' son remanentes de días pasados ​​cuando la extensión del archivo * .pl significaba "Biblioteca Perl". La forma moderna de reutilizar el código en Perl es organizarlo en módulos. Llamar a algo un "módulo" en lugar de una "biblioteca" es solo semántica, pero las palabras significan cosas claramente diferentes en la cultura Perl. Una biblioteca es solo una colección de subrutinas; un módulo proporciona un espacio de nombre, por lo que es mucho más adecuado para su reutilización.

use Module es la forma normal de usar el código de un módulo. Tenga en cuenta que Module es el nombre del paquete como una palabra clave y no una cadena entrecomillada que contiene un nombre de archivo. Perl maneja la traducción de un nombre de paquete a un nombre de archivo para usted. use instrucciones de use suceden en tiempo de compilación y lanzan una excepción si fallan. Esto significa que si un módulo del que depende su código no está disponible o no se carga, el error será aparente inmediatamente. Además, el use llama automáticamente al método de import() del módulo si tiene uno que puede ahorrarle un poco de tipeo.

require Module es como el use Module excepto que ocurre en el tiempo de ejecución y no llama automáticamente al método import() del módulo. Normalmente desea usar el use para fallar anticipadamente y predeciblemente, pero a veces es mejor. Por ejemplo, require se puede usar para retrasar la carga de módulos grandes que solo ocasionalmente se requieren o para hacer que un módulo sea opcional. (es decir, use el módulo si está disponible, pero recurra a otra cosa o reduzca la funcionalidad si no es así).

Estrictamente hablando, la única diferencia entre require Module y require ''file'' es que la primera forma desencadena la traducción automática desde un nombre de paquete como Foo::Bar a un nombre de archivo como Foo/Bar.pm mientras que la última forma espera un nombre de archivo para Empezar con. Por convención, sin embargo, el primer formulario se usa para cargar módulos mientras que el segundo se usa para cargar bibliotecas.


La principal diferencia está alrededor de la importación / exportación. Se prefiere el use cuando se utiliza un módulo porque le permite especificar qué rutinas desea importar a su espacio de nombres:

use MyModule qw(foo bar baz); # allows foo(), bar() and baz() to be used use MyModule qw(); # Requires explicit naming (e.g. MyModule::foo).

use también ejecuta el procedimiento import() del módulo que a menudo se usa para configurar el módulo.

Ver el perldoc para su uso para más detalles.