strawberry logo lane historia ejemplos perl

logo - perl vs python



¿Cuál es la mejor manera de saber si su perl se ejecuta en-e? (4)

¿Por qué estás tratando de averiguar si el módulo se incluyó desde la línea de comando? ¿Hay alguna situación que tengas donde sea importante? ¿Estás haciendo algo extraño con las importaciones? Cuéntanos qué estás tratando de hacer y probablemente pueda encontrar una forma mejor de hacerlo :)

De acuerdo, estás preguntando sobre exportar. ¿Cuál es el problema que estás tratando de resolver? ¿De qué manera lo quieres? ¿Exportaciones extra o menos predeterminadas desde la línea de comando? ¿Sabe que puede especificar una lista de importación con -M, incluida una etiqueta de exportación (por lo tanto, algo de% EXPORT_TAGS)? Y si quiere una lista de exportación vacía, puede usar -m (minúscula m) en su lugar. Ver la entrada para -M / -m en perlrun .

También podría interesarle el truco de "modulino", donde un archivo de módulo puede ser tanto un módulo como un script. Puede usarlo como un módulo regular, en cuyo caso tiene acceso a todos sus métodos o llamarlo como un script, en cuyo caso se ejecuta. Lo describo en mi artículo "Scripts as Modules" para The Perl Journal , así como también "Cómo un script se convierte en un módulo" en Perlmonks.

La pregunta no es cómo decir en un oneliner. Si está escribiendo el código de una sola línea, lo sabe . Pero, ¿cómo sabe un módulo, incluido en -MMy::Module::Name que todo comenzó desde un oneliner?

Esto es mío. Sin embargo, no es portátil y depende de los comandos estándar de UNIX (aunque puede hacerse más o menos portátil).

my $process_info = `ps $$ | tail -1`; my $is_oneliner = $process_info =~ m/perl.*?/s+-[^/P{IsLower}e]*e[^/P{IsLower}e]*/s+/m ;

Y si tienes una expresión regular elegante, puedes mejorar la mía.

Un par de personas me han preguntado por qué querría hacer esto. Brian adivinó correctamente que quería cambiar el comportamiento de exportación en función de si se trata de un script, que podemos suponer que tiene una cierta cantidad de diseño, o si es un oneliner donde el usuario intenta hacer todo lo posible en una sola línea de comando.

Esto suena mal, porque existe este credo de que los exportadores deben respetar otros paquetes, a veces conocido como " @EXPORT es MALO ". Pero me parece que es una tonta consistencia cuando se aplica a los onelineros. Después de que todo Perl se desvive por violar la estructura de su lenguaje y le dé bucles fáciles si los solicita en la línea de comando, simplemente quiero extender esa idea para mi dominio operacional / comercial. Incluso quiero aplicar filtros de origen ( ¡jadeo! ) Si esto ayuda.

Pero esta pregunta también sugiere que también podría querer ser un buen ciudadano de Perl, ya que solo para romper las pautas de la comunidad en ciertos casos. Es increíble poder crear acciones importantes a nivel empresarial simplemente cambiando la línea de comando en un programador por lotes en lugar de escribir un módulo completamente nuevo. El ciclo de prueba está muy comprimido.


$0 se establece en "-e" si se está ejecutando desde -e .


En su import() , el número de línea devuelto por la caller() será 0 si su módulo se cargó a través de -M . Esto es cierto siempre que se use -M (con -e o no) pero creo que es el único caso donde el número de línea es 0 .


Si desea un comportamiento de exportación diferente, la forma "limpia" de hacerlo sería usar un nombre de módulo diferente. Si realmente espera hacer mucho uso de una línea, incluso puede darle un nombre corto. Por ejemplo, MMN.pm:

package MMN; use My::Module::Name ''/./''; use Exporter (); @ISA = ''Exporter''; @EXPORT = @My::Module::Name::EXPORT_OK; 1;

Tenga en cuenta que Exporter tiene una característica de expresión regular poco conocida; es posible que solo quieras hacer

perl -MMy::Module::Name=/./ -e ...