2008-10-03 22 views
13

La pregunta no es cómo decirlo en un oneliner. Si está escribiendo el código en un trazador de líneas, , usted sabe que usted es. Pero, ¿cómo sabe un módulo, incluido en -MMy::Module::Name, que todo comenzó desde un oneliner?¿Cuál es la mejor manera de saber si su perl se ejecuta en -e?

Esto es mío. Es no portátil y aunque se basa en comandos estándar de UNIX (aunque, puede hacerse transportable más o menos.)

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 usted tiene una expresión regular snazzier, no dude en 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 hay este credo que los exportadores deben respetar otros paquetes - "! @EXPORT es MAL" a veces conocido como 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 (gasp!) si esto ayuda.

Pero esta pregunta también sugiere que también me gustaría ser un buen ciudadano de Perl, ya que solo rompo 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

¿Por qué le importaría a un módulo si se invocaba de esta manera? – moonshadow

Respuesta

34

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

+1

D'oh! Imprimí muchas variables, ¡pero no hice eso! – Axeman

+0

No encontré eso en Perlvar, ¿está _documentado_ en alguna parte? – Axeman

+4

Probablemente esté documentado solo en la fuente. :) Pero creo que ha sido cierto durante mucho tiempo. –

10

¿Por qué está tratando de averiguar si el módulo se incluyó desde la línea de comandos? ¿Hay alguna situación que tengas donde sea importante? ¿Estás haciendo algo extraño con las importaciones? Díganos lo que estamos tratando de hacer y, probablemente, se me ocurre una forma mejor de hacerlo :)


bien, que estás preguntando acerca de la exportación. ¿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? ¿Sabía 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. Consulte la entrada para -M/-m en perlrun.

Puede que también le interese el truco de "modulino" donde un archivo de módulo puede ser tanto un módulo como una secuencia de comandos. 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 "How a Script Becomes a Module" en Perlmonks.

+0

Sí, eso es básicamente eso. -e obtiene más exportaciones que los scripts definidos con precisión que sugieren al menos un espacio de paquete diseñado. No estoy tan preocupado por respetar el principal de un oneliner. – Axeman

+0

Brian: Las ideas presentadas en tu artículo "modulino" son/increíblemente/útiles. Desalienta los scripts 'hacky' y proporciona reutilización inmediata. Me encanta, y propongo agregarlo a las pautas internas de codificación el lunes. Uno de los problemas que tenemos es que los guiones tienden a ... – Dan

+0

... comienza pequeño y ligeramente hambriento, creciendo lentamente a un tamaño difícil de manejar , antes o después, esa funcionalidad se requiere en otro lugar, por lo que todo el lío necesita una refactorización (que rara vez se realiza sin problemas). Esto debería eliminar por completo el problema. – Dan

1

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

+0

perl -le '# línea 0' -e'sub {print join ":", llamador} ->() ' – ysth

+0

perl -le' # línea 1 '-e'sub {print join ":", llamador} - >() ' –

1

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. P.ej. 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 quiera hacer

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

No sé si eso es tan limpio, pero ya tengo un esquema para acortar los nombres para la invocación de línea de comando. – Axeman

Cuestiones relacionadas