我必须在Perl中使用命令行参数来初始化一个全局变量,而该全局变量又被传递给一组包以设置这些包中的变量值。我怎么做,假设我的主程序是main.pl,参数为$ opt_n,包是a.pm,b.pm和c.pm。
请帮忙。
答案 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)非常不同。