Я не взволнован с архитектурой передачи параметров, которую я развиваю для (много) сценарии Perl, которые были разработаны для некоторых сценариев, которые называют различные задания MapReduce Hadoop.
В настоящее время существует 8 сценариев (формы run_something.pl), которые выполняются от крона. (И больше на пути... мы ожидаем где угодно от еще 1 до 3 для каждой функции, которую мы добавляем к hadoop.) Каждый из них имеет приблизительно 6 идентичных параметров командной строки и пару параметров командной строки, которые подобны, все указанные с Euclid.
Реализации находятся в дюжине .pm модулей. Некоторые из которых распространены, и другие которого уникальны....
В настоящее время я передаю args глобально каждому модулю...
Внутри run_something.pl я имею:
set_common_args (%ARGV);
set_something_args (%ARGV);
И в Something.pm я имею
sub set_something_args {(%MYARGS) = _;}
Таким образом я могу сделать
if ( $MYARGS{'--needs_more_beer'} ) {
$beer++;
}
Я вижу, что, вероятно, собираюсь иметь дополнительные "общие" файлы, которым я захочу передать args, таким образом, у меня будет три или четыре вызова set_xxx_args наверху каждого run_something.pl, и это просто не кажется слишком изящным.
С другой стороны, это бьет передачу целого глупого массива аргументов вниз цепочка вызовов, и выбор и передача отдельных элементов вниз, цепочка вызовов (a), слишком много работы (b) подверженный ошибкам (c) не покупает много.
Большим количеством способов, чем я делаю, просто объектно-ориентированный дизайн без атрибутов объектно-ориентированного языка, и это выглядит более ужасным без упомянутых атрибутов, но тем не менее...
У кого-либо есть мысли или идеи?
В том же духе, что и ответ Педро, но обновлен для использования Moose и MooseX :: Getopt , я представляю сообществу SO ... модуль Moose modulino *: модуль Moose, который может быть включен и работать нормально как модуль или отдельно как утилита командной строки :
# this is all in one file, MyApp/Module/Foo.pm:
package MyApp::Module::Foo;
use Moose;
use MooseX::Getopt;
has [ qw(my config args here) ] => (
is => 'ro', isa => 'Int',
);
sub run { ... }
package main;
use strict;
use warnings;
sub run
{
my $module = MyApp::Module::Foo->new_with_options();
$module->run();
}
run() unless caller();
Модуль может быть вызван с помощью:
perl MyApp/Module/Foo.pm --my 0 --config 1 --args 2 --here 3
Используя этот шаблон, вы можете собирать аргументы командной строки с помощью одного модуля, который использует
d всеми другими модулями и сценариями, которые имеют те же параметры и используйте стандартные методы доступа Moose для получения этих параметров.
* modulinos - это модули, которые также можно запускать как автономные скрипты - шаблон проектирования Perl, созданный Брайаном Ди Фоем из SO.
Посмотрите на import
в Getopt :: Long
. Вы передаете аргументы вашему модулю через , используйте Module qw /.../
и получаете их через подпрограмму import
.
# Override import.
sub import {
my $pkg = shift; # package
my @syms = (); # symbols to import
my @config = (); # configuration
my $dest = \@syms; # symbols first
for ( @_ ) {
if ( $_ eq ':config' ) {
$dest = \@config; # config next
next;
}
push(@$dest, $_); # push
}
# Hide one level and call super.
local $Exporter::ExportLevel = 1;
push(@syms, qw(&GetOptions)) if @syms; # always export GetOptions
$pkg->SUPER::import(@syms);
# And configure.
Configure(@config) if @config;
}