当前位置:  开发笔记 > 编程语言 > 正文

如何将常见参数传递给Perl模块?

如何解决《如何将常见参数传递给Perl模块?》经验,为你挑选了1个好方法。

对于为一些调用各种Hadoop MapReduce作业的脚本开发的(很多)Perl脚本而言,我对于参数传递架构我并不感到兴奋.

目前有8个脚本(形式为run_something.pl)从cron运行.(还有更多的方法......对于我们添加到hadoop的每个函数,我们预计会增加1到3个.)每个函数都有大约6个相同的命令行参数,以及几个相似的命令行参数,所有这些都是指定的与欧几里德.

实现是在十几个.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,所以我将在每个run_something.pl的顶部有三个或四个set_xxx_args调用,它只是没有看起来太优雅了.

另一方面,它将整个愚蠢的参数数组传递到调用链中,并且选择并将单个元素传递到调用链下面是(a)过多的工作(b)容易出错(c)并不需要太多.

在很多方面,我所做的只是面向对象的设计而没有面向对象的语言陷阱,而且看起来更加丑陋而没有所谓的陷阱,但仍然......

有人有想法或想法吗?



1> Ether..:

与Pedro的答案一样,但升级为使用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由共享相同选项的所有其他模块和脚本执行,并使用标准Moose访问器方法来检索这些选项.

*modulinos是可以作为独立脚本运行的模块 - 由SO自己的brian d foy构建的Perl设计模式.


或者只是跳过样板主,消耗MooseX :: Runnable,然后说`mx-run MyApp :: Module :: Foo --args --go --here`.不需要黑客攻击.
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有