No estoy muy contento con la arquitectura de paso de argumentos que estoy desarrollando para los (muchos) scripts de Perl que se han desarrollado para algunos scripts que invocan varios trabajos de Hadoop MapReduce.¿Cómo puedo pasar argumentos comunes a los módulos de Perl?
Actualmente hay 8 scripts (del formulario run_something.pl) que se ejecutan desde cron. (Y más en el camino ... esperamos entre 1 y 3 más para cada función que agreguemos a hadoop.) Cada uno de estos tiene aproximadamente 6 parámetros de línea de comando idénticos, y un par de parámetros de línea de comando que son similares, todos especificados con Euclid.
Las implementaciones se encuentran en una docena de módulos .pm. Algunos de los cuales son comunes, y otras de las cuales son únicas ....
Actualmente estoy pasando los argumentos a nivel mundial para cada módulo ...
Dentro run_something.pl tengo:
set_common_args (%ARGV);
set_something_args (%ARGV);
Y dentro Something.pm tengo
sub set_something_args { (% MYARGS) = @ _; }
Entonces yo puedo hacer
if ($MYARGS{'--needs_more_beer'}) {
$beer++;
}
que estoy viendo que probablemente voy a tener archivos adicionales "comunes" que querrá pasar a args, así que voy a tener tres o cuatro llamadas set_xxx_args en la parte superior de cada run_something.pl, y simplemente no parece demasiado elegante.
Por otro lado, es mejor pasar toda la matriz de argumentos estúpidos por la cadena de llamadas, y elegir y pasar elementos individuales por la cadena de llamadas es (a) demasiado trabajo (b) propenso a errores (c) doesn ' comprar mucho
En muchas maneras lo que estoy haciendo es el diseño orientado a objetos, sin la parafernalia lenguaje orientado a objetos, y se ve feo y sin trampas dijo, pero no obstante ...
Cualquier persona tiene pensamientos o ideas?
O simplemente omita la regla estándar, consuma MooseX :: Runnable, y diga 'mx-run MyApp :: Module :: Foo --args --go --here'. No se requieren hacks. – jrockway