perl - 如何将通用参数传递给 Perl 模块?

标签 perl module

我对我正在为(许多)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)不会买太多。

在很多方面,我所做的只是面向对象的设计,没有面向对象的语言陷阱,而且没有所说的陷阱,它看起来更丑陋,但尽管如此......

有人有想法或想法吗?

最佳答案

与佩德罗的回答相同,但升级为使用 MooseMooseX::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/

相关文章:

perl - 如何在 Perl 中禁用隐式解码 ("upgrading")?

javascript - 在 Javascript 中创建其他文件所需的模块?

R Shiny 的 observeEvent 在模块中不起作用

linux - 我有一个从命令行完美运行但拒绝作为 cron 运行的 linux 脚本

perl - 为什么即使我用 FindBin 调整了@INC,我的 Perl 脚本也找不到我的模块?

Python 2.7 简介。到类 : "' module' object is not callable"

linux - printk 参数和 syslog.h 设施名称

java - 使用 Java 传递给 Perl 脚本的参数的问题

perl - SQLite十进制标记

ruby - bash 管道在 ruby​​ #system 中不起作用,并且在 ruby​​ Shell#system 中不起作用