perl包变量通过命令行设置

时间:2015-01-06 15:05:39

标签: perl perl-package

我必须在Perl中使用命令行参数来初始化一个全局变量,而该全局变量又被传递给一组包以设置这些包中的变量值。我怎么做,假设我的主程序是main.pl,参数为$ opt_n,包是a.pm,b.pm和c.pm。

请帮忙。

2 个答案:

答案 0 :(得分:2)

最简单的解决方案:在每个包中,创建一个setter方法:

package a;

our $global_for_a;

sub set_global_a { $global_for_a = shift; }

1;

#### Your main.pl

# Process GetOpt

a::set_global_a($opt_n);

有更高级的东西(例如根据加载的软件包列表自动调用setter),但这适用于了解Perl内部的高级用户。


另一种选择是直接访问main的值:

# Old code in a.pm
do_stuff($global_for_a);

# Instead, use Main's global:
do_stuff($main::opt_n);

答案 1 :(得分:2)

有很多方法可以实现目标。第一步是将命令行参数放入main.pl中的变量中。命令行参数可通过预定义的perl列表变量@ARGV获得。假设只有一个命令行参数,以下内容将起作用:

my $opt_n = $ARGV[0];

最好检查是否提供了正确数量的命令行参数。例如,

if  (not @ARGV) {die "No command line arguments were supplied.\n";}
if  (scalar(@ARGV) > 1) {die "Too many command line arguments were supplied.\n";}
my $opt_n = $ARGV[0];

如果您期望多个命令行参数,则使用shift运算符很方便。

my $opt_n = shift @ARGV;
my $opt_o = shift @ARGV;
if  (not defined $opt_o) {die "Too few command line arguments.\n";}

要在其他套餐中使用$ opt_n的值,您有两种选择:1)将$ opt_n全球化('我们的$ opt_n'而不是'我的$ opt_n'),或者2)将$ opt_n传递给其他软件包中的子例程,这些软件包将$ opt_n存储在其他软件包可访问的变量中。全局变量路由更简单,但它产生更多相互依赖和复杂的代码。如果您想这样做,请参阅' $ :: opt_n'在其他包中。

使用第二种方法,您可以从main.pl。

调用A.pm子程序
A::set_opt_n($opt_n);

在A.pm,你会写这样的东西:

package A;

use strict;

my $opt_n;

sub set_opt_n($)
{
    my ($opt_n_from_main) = @_;

    $opt_n = $opt_n_from_main;
    return;
}

从main.pl调用set_opt_n后,可以在A.pm中使用$ opt_n。当然,main.pl中的$ opt_n和A.pm中的$ opt_n是两个不同的变量。如果一个值的值发生变化,另一个值不会自动变化。这与使用单个全局变量$ :: opt_n(或$ main :: opt_n)非常不同。