Как передать общие аргументы модулям Perl? - PullRequest
6 голосов
/ 03 мая 2010

Я не в восторге от архитектуры передачи аргументов, которую я развиваю для (многих) Perl-скриптов, которые были разработаны для некоторых скриптов, которые вызывают различные задания Hadoop MapReduce.

В настоящее время существует 8 скриптов(в форме run_something.pl), которые запускаются из cron.(И еще в пути ... мы ожидаем от 1 до 3 больше для каждой функции, которую мы добавляем в hadoop.) Каждая из них имеет около 6 идентичных параметров командной строки и пара параметров командной строки, которые похожи, все указаныс Euclid.

Реализации находятся в дюжине модулей .pm.Некоторые из них являются общими, а другие уникальными ....

В настоящее время я передаю аргументы глобально каждому модулю ...

Внутри run_something.pl У меня есть:

set_common_args         (%ARGV);
set_something_args      (%ARGV);

А внутри Something.pm у меня есть

sub set_something_args {(% MYARGS) = @ _;}

Итак, я могу сделать

if ( $MYARGS{'--needs_more_beer'} ) { 
    $beer++;
}

Я вижу, что у меня, вероятно, будут дополнительные "общие" файлы, которым я хочу передать аргументы, поэтому ябудет три или четыре вызова set_xxx_args в верхней части каждого run_something.pl, и это просто не кажется слишком элегантным.

С другой стороны, это лучше, чем передавать весь массив глупых аргументов по цепочке вызовови выбор и передача отдельных элементов по цепочке вызовов - это (а) слишком много работы (б) подверженность ошибкам (в) не очень дорого.

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

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

Ответы [ 2 ]

10 голосов
/ 04 мая 2010

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

Используя этот шаблон, вы можете собирать аргументы командной строки, используя один модуль, который use d для всех других модулей и сценариев с одинаковыми параметрами, и использовать стандартные методы доступа Moose для извлечения этих параметров.

* Модули - это модули, которые также можно запускать как автономные скрипты - шаблон проектирования Perl от собственного Брайана Д. Фой.

4 голосов
/ 03 мая 2010

Взгляните на import в Getopt::Long. Вы передаете аргументы в свой модуль через use 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...