全局定义数组,用子程序填充它,然后在脚本的另一部分访问它是不好的做法吗?如,
use strict;
use warnings;
my @people = qw( Ted Bill Tom);
my @names;
&main;
sub main{
foreach(@people){
&fillNames;
}
}
sub fillNames {
undef @names;
print "$_\n";
push(@names,$_);
}
在上面的例子中,我本来可以让子程序返回数组,但在我的程序中我用多个数组做这个(据我所知,子程序不能返回多个数组)。
我看到这样做的另一种方法是创建一个文件,让子程序为文件的每个索引打印数组的内容,然后让主子程序访问该文件。这是一个更好的方法吗?
答案 0 :(得分:2)
通常避免使用全局变量的原因是你很容易遭受“污染” - 更多变量修改的变量使得很难跟踪破碎的代码。
对于简短的剧本,你一般都很好。
我真的会避免使用像&fillnames;
这样的习语。那是在做一些你可能并不完全期望的事情。以这种方式调用sub'传递'隐含变量,这不是一个好的风格(在我看来)。
相反:
foreach my $person ( @people ) {
fillNames ( $person );
}
子程序不能返回多个数组,你说得对。好吧,有点 - 它返回一个平面列表,并连接元素。如果要返回多个数组,则需要通过引用来完成。
E.g:
sub return_two_arrays {
my @array1 = ( "one", "two", "three" );
my @array2 = ( "four", "five", "six" );
return ( \@array1, \@array2 );
}
my ( $array1_ref, $array2_ref ) = return_two_arrays();
print join ( "\n", @$array1_ref );
作为一个注意事项 - 您的代码取消定义@names,然后将值推入其中。这可能不是你想要做的 - 而且正是使用'全局'可能导致的那种问题。因为实际上,你只会在@names中拥有最后一个'名字'。
答案 1 :(得分:1)
这里没有剪切和干涩的答案,但我想说这取决于剧本的大小和范围。
如果您的脚本足够小以至于很容易跟踪全局变量,那么我说这没问题。但是,一旦超出一定的规模和复杂程度,我就会对以这种方式使用全局数组持谨慎态度。