全局定义的数组

时间:2014-07-10 11:53:22

标签: perl

全局定义数组,用子程序填充它,然后在脚本的另一部分访问它是不好的做法吗?如,

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,$_);


    }

在上面的例子中,我本来可以让子程序返回数组,但在我的程序中我用多个数组做这个(据我所知,子程序不能返回多个数组)。

我看到这样做的另一种方法是创建一个文件,让子程序为文件的每个索引打印数组的内容,然后让主子程序访问该文件。这是一个更好的方法吗?

2 个答案:

答案 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)

这里没有剪切和干涩的答案,但我想说这取决于剧本的大小和范围。

如果您的脚本足够小以至于很容易跟踪全局变量,那么我说这没问题。但是,一旦超出一定的规模和复杂程度,我就会对以这种方式使用全局数组持谨慎态度。