如何将常见参数传递给Perl模块?
对于为一些调用各种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 { 那么我就可以做到 if ( $MYARGS{'--needs_more_beer'} ) { $beer++; } 我看到我可能会有其他“常见”文件,我想要传递args,所以我将在每个run_something.pl的顶部有三个或四个set_xxx_args调用,它只是没有看起来太优雅了. 另一方面,它将整个愚蠢的参数数组传递到调用链中,并且选择并将单个元素传递到调用链下面是(a)过多的工作(b)容易出错(c)并不需要太多. 在很多方面,我所做的只是面向对象的设计而没有面向对象的语言陷阱,而且看起来更加丑陋而没有所谓的陷阱,但仍然…… 有人有想法或想法吗? 解决方法
与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 使用此模式,您可以使用一个模块收集命令行参数,该模块由共享相同选项的所有其他模块和脚本使用,并使用标准Moose访问器方法来检索这些选项. * modulinos是可以作为独立脚本运行的模块 – 由SO自己的brian d foy构建的Perl设计模式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |