我对我正在为(许多)Perl 脚本开发的参数传递架构并不感到兴奋,这些脚本是为一些调用各种 Hadoop MapReduce 作业的脚本开发的。
当前有 8 个脚本(形式为 run_something.pl)从 cron 运行。 (还有更多……我们希望我们添加到 hadoop 的每个函数都会增加 1 到 3 个。)每个函数都有大约 6 个相同的命令行参数,以及几个相似的命令行参数,全部指定与欧几里得。
这些实现在十几个 .pm 模块中。其中一些是常见的,而另一些则是独一无二的......
目前我正在将参数全局传递给每个模块......
在 run_something.pl 我有:
set_common_args (%ARGV);
set_something_args (%ARGV);
在Something.pm里面我有
子集_something_args {
(%MYARGS) =@_;
}
那么我可以做
if ( $MYARGS{'--needs_more_beer'} ) {
$beer++;
}
我看到我可能会有额外的“公共(public)”文件,我想将 args 传递给,所以我将在每个 run_something.pl 的顶部调用三到四个 set_xxx_args,它只是没有看起来不太优雅。
另一方面,它胜过将整个愚蠢的参数数组传递到调用链中,并且在调用链中选择和传递单个元素是(a)太多工作(b)容易出错(c)不会买太多。
在很多方面,我所做的只是面向对象的设计,没有面向对象的语言陷阱,而且没有所说的陷阱,它看起来更丑陋,但尽管如此......
有人有想法或想法吗?
最佳答案
与佩德罗的回答相同,但升级为使用 Moose和 MooseX::Getopt ,我向 SO 社区介绍... 一只驼鹿 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 访问器方法来检索这些选项。*modulinos 是也可以作为独立脚本运行的模块——SO 自己的 brian d foy 的 Perl 设计模式。
关于perl - 如何将通用参数传递给 Perl 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2760613/