Как я могу передать общие аргументы модулям Perl?

Я не взволнован с архитектурой передачи параметров, которую я развиваю для (много) сценарии 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) не покупает много.

Большим количеством способов, чем я делаю, просто объектно-ориентированный дизайн без атрибутов объектно-ориентированного языка, и это выглядит более ужасным без упомянутых атрибутов, но тем не менее...

У кого-либо есть мысли или идеи?

6
задан brian d foy 3 May 2010 в 21:08
поделиться

2 ответа

В том же духе, что и ответ Педро, но обновлен для использования 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.

10
ответ дан 8 December 2019 в 17:19
поделиться

Посмотрите на 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;
}
4
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: